2015-01-12 2 views
4
  • 다른 점이 있습니까?std :: function vs function pointer

  • "저장/전송"기능을 사용하는 가장 좋은 방법은 무엇입니까?

    function<void(int)> fcn = 
            [](int par) {std::cout<<"fcn: "<<par<<std::endl; }; 
    void(*fcn_a)(int) = 
            [](int par) {std::cout<<"fcn_a: "<<par<<std::endl; }; 
    
    
    fcn(12); 
    fcn_a(12); 
    

답변

5

std::function은 더 일반적인 - 당신은 거기에 올바른 서명 (함수 포인터, 방법 포인터, operator()와 객체)을 호출 가능한 객체를 저장할 수 있으며 std::bind를 사용 std::function을 구성 할 수 있습니다.

함수 포인터는 올바른 서명이있는 함수 만 수락 할 수 있지만 약간 더 빠르며 약간 작은 코드가 생성 될 수 있습니다.

5

캡쳐되지 않은 람다의 경우 함수 포인터를 사용하는 것이 std::function을 사용하는 것보다 빠릅니다. 이것은 std::function이 훨씬 더 일반적인 짐승이고 전달 된 함수 객체를 저장하기 위해 타입 소거를 사용하기 때문입니다. 이것은 타입 소거를 통해 이것을 실현합니다. 이것은 operator()이라는 가상의 호출로 끝나는 것을 의미합니다.

OTOH, 비 캡처 람다는 암시 적으로 해당 함수 포인터로 변환 가능합니다. 그러나 본격적인 폐쇄가 필요한 경우 람다를 std::function에 할당하거나 가능한 경우 템플릿을 통해 유형 공제에 의존해야합니다.