2011-11-19 4 views
13

는 일반적인 적분 함수를 비교하여 대 값에 의해 펑 객체를 전달 ? STL은 첫 번째 접근법 (값으로 전달)을 사용합니다. 가장 보편적 인 방법입니다. 무료 함수 이름은 L- 할 수 없기 때문에참조 (C++)

상황을 감안할 때
+0

STL은 일반적으로 참조 컨테이너 등을 사용할 때 많은 문제가 발생하기 때문에 일반적으로 첫 번째 방법을 사용합니다. –

+2

다른 모든 것과 동일합니다. 'F'가 무엇인지에 따라 이러한 버전의 범위는 매우 다를 수 있습니다. 'F'가 상태 저장 인 경우 중간 버전 만 가능할 수 있습니다. –

+0

기본적으로 사용자는 원하는 형식을 선택하여 사용자에게 요구 사항을 적용합니다. 가치에 의한 것이라면 무결성을 잃지 않고 복사 할 수있는 펑터를 제공해야합니다. 참고로, 당신은 당신이 그것을 두는 어떤 사용자든지에 적합한 일생에 무언가를 줄 것을 요구하고있다. – Mordachai

답변

19

함수 객체는 일반적으로 작아야하므로 값으로 전달하면 성능이 눈에 띄게 떨어질 것이라고 생각합니다 (함수가 본문에서 수행하는 작업과 비교해보십시오). 값별로 전달하면 코드 분석에서 얻을 수 있습니다. by 값 매개 변수는 함수의 지역적이며 최적화 프로그램은 펑터의 데이터 멤버에서로드를 생략 할 수있는시기를 알려줄 수 있습니다.

functor가 stateless 인 경우 인수로 전달하면 아무런 비용도 들지 않습니다. functor가 가져 오는 패딩 바이트에는 (적어도 GCC에서 사용되는 Itanium Abi에서는) 특정 값이 필요하지 않습니다. 참조를 사용할 때 항상 주소를 전달해야합니다.

마지막 함수 (const T&)는 C++ 03에서는 함수 유형에 const을 적용하려고하면 C++ 03에서 프로그램이 잘못 작성되어서 C++ 03에서 원시 함수로 작동하지 않는다는 단점이 있습니다. (그리고 SFINAE 사례입니다). 최근 구현에서는 함수 유형에 적용 할 때 const을 무시합니다.

두 번째 것 (T&)에는 일시적인 펑터를 전달할 수 없다는 단점이 있습니다.

간단히 말해서, 구체적인 경우 명확한 이점이없는 한 일반적으로 값으로 전달합니다.

3

, F는

이제 "호출 객체"(무료 함수 또는 정의 된 연산자()를 갖는 클래스 같은) 될 것으로 예상된다 두 번째 버전은 적합하지 않습니다. 세 번째는 F :: operator()가 const가 될 것이라고 가정합니다 (F의 상태를 변경해야하는 경우는 아닐 수도 있음) 첫 번째는 "자체 복사본"에서 작동하지만 F는 복사 할 수 있어야합니다.

세 가지 중 어느 것도 "보편적"이지만 가장 일반적인 경우는 가장 일반적입니다.

5

STL은 첫 번째 방법 (값 통과) 물론

는 표준 라이브러리 값과 반복자 펑 패스를 사용한다. 복사가 싼 것이 옳다고 (잘못되었거나 잘못) 추측되며 이는 복사하는 데 비용이 많이 드는 반복기 나 펑터를 작성하면 나중에 최적화 할 방법을 찾아야 할 수도 있음을 의미합니다.

그러나 이것은 표준 라이브러리가 펑터를 사용하는 목적을위한 것입니다. 대부분 이것들은 술어입니다. 다만, std::transform과 같은 것도 있습니다. 만약 당신이 함수를 통합한다면, 그것은 어떤 종류의 수학 라이브러리를 제안합니다.이 경우 많은 국가를 가지고있는 함수를 다룰 가능성이 훨씬 더 높을 것이라고 생각합니다. 예를 들어 n + 1 계수를 비 정적 데이터 멤버로 사용하여 n 차 다항식을 나타내는 클래스를 만들 수 있습니다.

그런 경우에는 const 참조가 더 나을 수도 있습니다. 그러한 펑터를 transform과 같은 표준 알고리즘으로 사용하는 경우 포인터를 통해 간접적 인 작업을 수행하는 작은 클래스로 포장하여 저렴한 비용으로 복사 할 수 있습니다.

비 const 참조를 취하는 것은 일시적으로 전달되는 것을 중지하기 때문에 사용자에게 잠재적으로 짜증이납니다.