함수 포인터의 단점은 다음과 같습니다.

1) 디버깅이 어렵다.
(콜백함수나 이벤트 핸들링의 경우가 아니고) 함수 포인터를 사용하여 수동으로 호출하는 함수가 몇십개나 된다고 가정해 봅시다.
분 기하기전에 브레이크 포인트를 걸고 어떤 함수로 분기하고자하는지 알고자 할때는 너무 어렵죠. 예를 들어 변수 a라면 값을 바로 알아 낼 수 있지만, 함수 포인터 p라면 그 값이 어떤 함수를 가리키는지 알 수가 없죠. 이럴때는 분기 가능한 모든 함수에 브레이크 포인터를 거는 수밖에 없습니다.

2) 속도가 느리다.
ANSI C 라이브러리에서 함수 포인터를 사용하는 대표적인 함수인 qsort의 경우를 생각해 봅시다. 대소 비교를 위해서 fcmp라는 함수 포인터를 사용하는 데, 이건 qsort 내부에서 대소 비교가 필요할 때마다 매번 호출됩니다.
실제 정렬하는 시간보다 함수 호출을 위한 비용이 훨씬 크게 되어버립니다.

그래서 ANSI C++ STL에서 이런 문제점을 해결하기 위해 만든 것이 함수 포인터를 대신하는 함수 객체(function object)입니다.
함수 객체란 멤버 함수로 함수 하나만 들어 있는 매우 간단한 클래스입니다.
클래스이기 때문에 당연히 인라이닝할 수 있지요.
그래서, STL의 sort가 C의 qsort보다 무려 67000배나 빠릅니다!

콜백함수나 이벤트 핸들링과 같이 반드시 필요한 경우나,
함수 포인터를 써야만 코드가 매우 간결해지는 경우외에는 가능한 한 사용하지 않는 것이 좋습니다.

출처 : 볼랜드포럼

+ Recent posts