>백엔드 개발 >C++ >std::function 대 ​​함수 포인터: C에서 언제 각각을 선택해야 합니까?

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

Susan Sarandon
Susan Sarandon원래의
2024-11-12 07:38:01533검색

 std::function vs. Function Pointers: When Should You Choose Each in C  ?

std::function 대 ​​C의 함수 포인터: 무엇을 언제 선택해야 할까요?

C에서 콜백 함수를 정의할 때 , C 스타일 함수 포인터와 std::function이라는 두 가지 주요 옵션이 있습니다. 이 선택은 코드의 기능과 효율성에 큰 영향을 미칠 수 있습니다.

C 스타일 함수 포인터

함수 포인터는 오랫동안 사용되어 왔으며 여전히 널리 사용되고 있습니다. 이는 함수에 대한 포인터를 저장하는 단순성을 제공합니다:

void (*callbackFunc)(int);

그러나 상당한 제한이 있습니다:

컨텍스트 캡처 부재: 함수 포인터는 상위 함수의 컨텍스트(예: 캡처된 변수)를 유지합니다. 즉, 쉽게 람다 함수를 전달하거나 객체의 멤버 함수를 콜백으로 호출할 수 없습니다.

std::function

std::function(C 11에서 도입됨)은 이러한 한계를 극복하도록 설계되었습니다. 이는 함수를 저장하고 전달하는 유형 안전하고 일반적인 방법을 제공합니다.

std::function< void(int) > callbackFunc;

std::function:

  • 컨텍스트의 장점 Capture: std::function은 상위 함수의 컨텍스트를 캡처하여 람다 또는 멤버 함수를 사용할 수 있습니다. 포인터.
  • 저장: std::function은 데이터 멤버에 저장될 수 있으므로 콜백 등록 및 영구 함수 저장에 적합합니다.
  • 범용 호환성: 함수 포인터, 펑터 및 Lambdas.

std::function의 단점:

  • 콜 오버헤드: std::function을 호출하면 약간의 직접 기능에 비해 성능 오버헤드 호출.
  • 인라인되지 않음: std::function에 대한 호출은 직접 함수 호출과 달리 기본적으로 인라인되지 않습니다.

템플릿 매개변수

특히 작은 기능에 적합한 세 번째 옵션은 호출 가능 객체 유형:

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}

템플릿 매개변수의 장점:

  • 인라인화: 콜백 함수에 대한 호출이 인라인됩니다. 성능을 향상합니다.
  • 컨텍스트 캡처: 컨텍스트 캡처도 허용합니다.

템플릿 매개변수의 단점:

  • 헤더 구현 요구 사항: 전체 유형을 지원하려면 템플릿 매개변수가 포함된 함수를 헤더에 구현해야 합니다.

요약 표

요약하면 다음 표에 이러한 옵션 간의 주요 차이점이 요약되어 있습니다.

Feature Function Pointer std::function Template Parameter
Context Capture No Yes Yes
Call Overhead No Yes No
Inlining No No Yes
Class Member Storage Yes Yes No
C 11 Support Yes No Yes
Readability Less Readable More Readable Somewhat Readable

대부분의 경우 함수 포인터나 템플릿 매개변수에 대한 특정 요구 사항이 없으면 유연성, 컨텍스트 캡처 기능 및 범용 호환성으로 인해 std::function이 선호됩니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.