나는 제 I는 A와 B 파라미터 심지어 어떤 괄호없이 펑이 sort_ints에서 언급 된 오퍼레이터() (INT의 A, INT의 B)로 전달 됐는지 궁금에서 WikipediaFunction Objects의 작동을 이해하는데 도움이됩니까?
class compare_class {
public:
bool operator()(int A, int B) const {
return A < B;
}
};
...
// Declaration of C++ sorting function.
template <class ComparisonFunctor>
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
...
int main() {
int items[] = {4, 3, 1, 2};
compare_class functor;
sort_ints(items, sizeof(items)/sizeof(items[0]), functor);
}
에 코드를 발견 .
그런 다음 A와 B가 sort_ints 함수 내부의 함수 객체로 전달되는 것으로 생각했습니다. 그렇다면 sort_ints의 선언에 함수의 주소를 받기 때문에 'ComparisonFunctor c'대신 'ComparisonFunctor * * * c'가 없어야합니까?
sort_ints 함수 안에서 functor에 대한 함수 호출이 다음과 같이 수행됩니까?
functor(*begin_items, *(begin_items+1));
sort_ints의 세 번째 매개 변수가 실제로 전체 개체를 값으로 사용한다는 의미입니까? 큰 물체로 작업 할 때 그 점이 좋지 않거나 비효율적이지 않습니까? – Nav
@Nav : 예 - 참조가 더 좋을 것입니다. 그러나 비교 객체는 상태가별로 좋지 않으며 정렬되는 항목의 수에 관계없이 한 번만 전달되기 때문에 큰 문제는 아닙니다. –
@ Nav- 컴파일러는 대개'operator()'를 호출 할 때 수신기 객체를 그림 밖으로 적극적으로 최적화하는 데 정말로 좋습니다. 컴파일러가 어떤 함수가 컴파일 타임에 호출되는지 (수신기의 타입을 알고 있기 때문에) 컴파일러가 해결할 수 있다는 사실과 함께, 원시 함수보다 함수 객체를 사용하는 것이 훨씬 빠릅니다! (실행 파일을 더 크게 만들지 만) – templatetypedef