2015년 10월 3일 토요일

[C++] function object

function object
: 함수 호출 연산자( () )를 재정의한 객체

먼저 간단한 오름차순, 내림차순 정렬 알고리즘을 작성해보자.

일반적으로 라이브러리를 설계할 때 변하는 것(정책)과 변하지 않는 것(알고리즘)을 분리하게 된다.
하지만 여전히 중복 코드가 발생하는 것을 볼 수 있다.
함수 포인터를 이용해서 코드를 수정해보자.


함수 포인터를 이용하는 것은 라이브러리 로써 성능을 떨어뜨리게 된다.
함수 포인터는 결국에 함수를 호출하는 것인데, 함수 호출하는 것 자체가 부담이 되고,
더군다나 sort 에서 이중 for 문에 포함되므로 부담은 배가 된다.

그러므로 함수 포인터 대신에 inline 함수로 대체할 경우 성능에 큰 향상을 가져올 수 있다.

하지만 asc_int, dsc_int 를 inline 으로 대체한다고 해서 sort함수에서 inline으로 대체되는가?
그렇지 않다. sort 내에서 결국에는 cmp 가 함수 포인터이기 때문에 call로 호출된다.(inline으로 치환되지 않는다!)

bool (*cmp)(int, int) 라는 함수의 타입을 컴파일러가 알게 한다면 inline으로 치환될 수 있다.
C++에서는 함수객체를 이용해서, 함수의 타입을 알 수 있다.



함수 객체란 함수 호출 연산자( () )를 재정의한 객체로,
일반 함수와 달리 상태를 가질 수 있다.
add와 sub 가 다른 타입임을 인지하자!


중복 코드가 발생하므로, 탬플릿 이용해서 다시 코드를 변경해보자.


함수 객체, inline, template을 사용해서
중복 코드를 제거하고 성능향상 까지 가져올 수 있다.


STL library 에서 제공하는 sort는 함수 포인터 버전이다.
그렇다면 개발자가 성능 향상을 목적으로 함수 객체를 사용하고 싶다면?
STL 은 class template 을 제공하여 함수 객체를 사용하도록 돕고 있다.

함수 포인터 버전
장점 : 정책을 변경하여도 sort에 대한 함수의 기계어 코드는 하나가 된다.(메모리 최적화)
단점 : 정책이 inline 치환이 적용되지 않는다.

함수 객체 버전
장점 : 정책을 inline을 적용하여 성능을 향상 시킬 수 있다.
단점 : 정책을 변경한 횟수만큼 sort 함수의 기계어 코드가 생성되므로 메모리 사용량이 증가한다.








댓글 없음:

댓글 쓰기

[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...