함수 객체 : 함수호출 연산자를 가진 클래스를 함수 객체 또는 functor 라고 한다.
- 함수객체는 () 연산자를 정의한 객체
- 함수처럼 동작하려면 객체가 operator()을 정의 해야 한다.
- 함수처럼 동작하는 객체이므로 다른 멤버 변수와 멤버 함수를 가질 수 있고, 일반 함수에서 하지 못하는 지원을 받을 수 있다.
- 함수객체는 내부변수를 가질 수 있다. 사용자가 함수 객체를 사용하면서 다른 상태를 가질수 있다.
- 함수처럼 사용할 수도 있으면서 상태를 가질 수 있다.
- 함수처럼 동작 하려면 () 연산자를 재정의 해야 한다,
- () 연산자는 함수 호출 연산자
장점
- 1) 함수객체는 상태를 가실 주 있다. 같은 객체에 대해 동시에 다른 상태를 가질 수 있음
- 2) 각각의 함수 객체는 자신만의 탇입을 가지므로, 함수 객체의 타입을 템플릿의 인자로 제공가능함
- 3) 함수객체는 함수포인터 보다 빠르다
함수객체가 일반함수보다 빠른 이유
- 1) 인라인이 가능하여 처리 속도를 대폭적으로 개선할 수 있다
- 2) 컴파일러에 의해 쉽게 최적화가 될 수 있다
- 3) 함수포인터는 깊은 뎁스까지 내려가면서, 간접 호출이 이루어 질 수 있다.
인라인 함수는 함수의 내용이 간결하여 함수를 호출하는 대신에 함수의 내용을 호출한 곳에 치환되는 함수이다.
- 이것은 컴파일( compile ) 시에 이루어지기 때문에 함수 호출 오버헤드( overhead )를 줄일 수 있지만, 잘못 사용할 경우 함수의 내용이 치환되기 때문에 코드 비대화를 일으킬 수 있으므로 유의하여 사용해야 한다.
- 함수의 모양( signature )이 같다면 함수 이름이 달라도 같은 타입( type )의 함수로 평가되고, 그렇기 때문에 함수 포인터( pointer )에 다른 함수의 주소를 저장할 수 있다.
- 함수 포인터는 컴파일 시에 어떤 함수가 호출될지 전혀 알 수 없기 때문에 컴파일 시 처리되는 인라인 치환이 적용되지 않는다.
STL에서 제공하는 알고리즘 중에는 조건을 판단하기 위해 함수 객체를 사용하는데, 그 이유가 바로 인라인 치환을 하여 효율을 높이기 위해서이다.
- 함수 객체는 작기 때문에, 클래스 구현 안에 () 연산자를 직접 구현하기 때문에 inline 키워드( keyword )를 명시하지 않아도 컴파일러( compiler )가 자동으로 평가하여 [인라인 치환]을 처리한다.
- [알고리즘이 템플릿을 사용]하기 때문에 컴파일 시에 어떤 함수 객체를 사용하는지 알 수 있기 때문에 가능하다.
- 만약 함수 객체가 아니라 함수 포인터를 사용한다면 해당 컨테이너의 모든 요소를 순회하면서 매번 함수를 호출하기 때문에 함수 호출 오버헤드가 비교적 클 것이다.