> 백엔드 개발 > C++ > 본문

std::function 대 ​​함수 포인터: 언제 각각을 선택해야 합니까?

Linda Hamilton
풀어 주다: 2024-11-11 05:24:03
원래의
135명이 탐색했습니다.

std::function vs. Function Pointer: When Should You Choose Each?

std::function 대 ​​C의 함수 포인터: 최선의 선택

C에서는 콜백 함수를 구현할 때 선택이 자주 발생합니다. C 스타일 함수 포인터 또는 std::function을 사용하는 사이에 발생합니다. 두 접근 방식 모두 장단점이 있지만 대부분의 경우 std::function이 더 나은 옵션입니다.

함수 포인터: 제한된 기능

예시된 함수 포인터 다음 코드에는 근본적인 제한이 있습니다.

void (*callbackFunc)(int);
로그인 후 복사

컨텍스트 변수를 캡처할 수 없으므로 해당 변수에 의존하는 람다 함수를 전달하거나 비정적 객체 데이터 멤버를 호출하는 것이 불가능합니다.

std::function: 다목적 및 효율성

반대로, std::function(C 11에서 도입됨)은 임의 유형의 함수를 저장하고 사용할 수 있습니다. 다음과 같은 이점을 제공합니다.

  • 컨텍스트 변수 캡처: Lambda 함수 및 비정적 객체 데이터 멤버를 콜백으로 전달할 수 있습니다.
  • 아니요 저장 오버헤드: std::function은 콜백을 저장하기 위해 설계되었으며, 이는 클래스 멤버에 콜백을 저장할 때 유용할 수 있습니다.
  • 함수 호출의 사소한 오버헤드: std::function이 발생합니다. 함수 호출 시 약간의 오버헤드가 발생하지만 대부분의 경우 무시할 수 있습니다.
  • 읽기 쉽고 편리함: std::function은 일관성 있고 읽기 쉬운 코드를 촉진하여 신중한 의사 결정의 필요성을 최소화합니다.

템플릿 매개변수: 대안

어떤 경우에는 템플릿 매개변수를 호출 가능한 객체로 사용하는 것이 도움이 될 수 있습니다. 호출 가능한 객체(함수 포인터, 펑터, 람다, std::function 등)를 매개변수로 전달할 수 있습니다. 그러나 몇 가지 단점도 있습니다.

  • 헤더 기반 구현: 외부 함수는 템플릿이 되며 헤더에 구현해야 합니다.
  • 클래스 멤버에 저장할 수 없음: 템플릿 매개변수는 클래스의 멤버로 저장할 수 없습니다.

비교 요약

다음 표에서는 각 접근 방식의 강점과 약점:

Feature Function Pointer std::function Template Parameter
Context variable capture No¹ Yes Yes
Call overhead No No Yes
Inlining potential No No Yes
Class member storage Yes Yes No²
Header implementation Yes Yes No
C 11 support Yes No³ Yes
Readability No Yes (Yes)

결론

요약하자면, std::function은 일반적으로 C에서 콜백 함수를 구현하는 데 권장되는 선택이며 다양성, 편의성 및 최소한의 오버헤드를 제공합니다. 함수 포인터는 헤더 없는 구현이나 엄격한 성능 요구 사항이 있는 경우와 같은 특정 요구 사항에 여전히 유용합니다. 유연성이 우선이라면 템플릿 매개변수를 호출 가능한 객체로 고려하는 것이 실행 가능한 옵션일 수 있습니다.

위 내용은 std::function 대 ​​함수 포인터: 언제 각각을 선택해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿