2013-02-20 4 views
2

std :: function을 콜백 처리기로 사용하려고합니다. 이 예에서는 이와 같은메서드 인수, 복사 또는 shared_ptr에 대한 std :: function?

같은

void some_job(int arg1, std::function<void(int)> & callback) 
{  
    callback(process(arg1)); 
} 

난 패스 별 기준을 사용 하였다.

그러나 문제점은 내 프로그램에서 비동기 컨텍스트에서 함수가 실행되기 때문에 개체 인 callback이 여전히 존재한다는 것을 보장 할 수 없습니다.

그래서 함수 객체의 수명주기를 관리해야하므로 두 가지 방법으로 생각했습니다. std::shared_ptr

내가 std::function의 크기가 24 내 시스템 바이트 std::shared_ptr 고정 알고 사용

  1. 하여 통과하여 값 (사본)

  2. 8.

    이고

    그러나 std::shared_ptr을 복사하면 참조 카운터를 관리하는 추가 오버 헤드가 발생합니다. (더구나 std::function의 shared_ptr 개체를 만드는 현명하고 깔끔한 방법을 찾을 수 없습니다.)

    성능면에서 어느 쪽이 더 좋을까요? 당신이 그래서 시간이 중요한 그것이 오버 헤드 공유 + 24 바이트 8 바이트를 복사 빠르다 여부를 걱정 프로그램의 일부에있는 경우

+3

그냥 값으로 복사하고 그 값으로 완료하십시오. –

+0

"성능면에서 어느 쪽이 좋을까요?" 현실적인 실행 시나리오로 측정하십시오. 그러나 나는 가치를 지니고 문제가된다면 그것에 대해서만 생각할 것입니다. – juanchopanza

+0

토니의 대답은 거의 확실합니다. 공유 포인터 참조 계산은 너무 무겁습니다. 성능 문제를 프로파일 링하고 시연 할 때까지 복사하는 것이 좋으며 걱정하지 않아도됩니다. –

답변

3

, 당신은 모두 구현해야하고 알아 프로파일 러를 사용합니다 특정 시나리오에서 더 좋습니다. 그리고 그러한 경우에는 아마도 std::function::operator() 안에 숨겨진 가상 호출을 우회 할 수있는 완전히 다른 접근법을 고려해야합니다.

그렇지 않으면 매개 변수를 값으로 사용하고 옵티마이 저는 그 작업을 수행합니다.

+0

너희들 말이 맞아. 나는 너무 많이 걱정하고 있었다. – user2020192