|
넵! 님의 의견이 맞습니다.
저같은 경우 속도 증진을 위해 함수 호출시 호출 회수뿐만 아니라 호출시 전달 인자 개수까지 신경을 써야 할일이 많습니다. 때문에 프로그램 초기 설계를 잘못해 놓으면 프로파일링시 죽음이죠.
하지만 함수포인터 때문에 속도가 느리다는 좀 의미가 상이한것 같습니다.
C의 QSORT가 속도가 느린것은 퀵소트 내부에서 함수를 호출하는 자체때문에 느린것입니다.
sort나 inline의 성능 설명이 아닌 함수포인터 설명에서 STL과 C의 qsort 함수간의 비교는 좀 어울리지 않지 않나 합니다.
디버깅이라.. 글세 전 리눅스에서 함수포인터 쓴곳에서 s 키 누르면 따라 들어간것 같았습니다만 잘 기억이 나지 않군요. 왜냐하면 함수포인터 때문에 디버깅때 문제 생긴적이 없은듯해서요.
함수 포인터 남용하면 코드해독이 어려울 뿐만 아니라 여러가지로 문제가 많죠. 저도 프로그래밍시 대안이 함수포인터 밖에 없는경우만 함수포인터를 사용합니다.
원래 이글의 질문자께서 'C++에선 함수포인터 안쓴다.'라는 논제에 제가 'C++에서도 당연히 함수포인터 쓴다.'라는 의미의 리플이였는데 어쩌다 이렇게까지 설명하게 되었군요.
김백일 님이 쓰신 글 :
: (이 글은 아리랑님의 리플에 대한 답글입니다.)
:
: 함수 포인터의 단점은 다음과 같습니다.
:
: 1) 디버깅이 어렵다.
: (콜백함수나 이벤트 핸들링의 경우가 아니고) 함수 포인터를 사용하여
: 수동으로 호출하는 함수가 몇십개나 된다고 가정해 봅시다.
: 분기하기전에 브레이크 포인트를 걸고 어떤 함수로 분기하고자하는지
: 알고자 할때는 너무 어렵죠. 예를 들어 변수 a라면 값을 바로 알아 낼
: 수 있지만, 함수 포인터 p라면 그 값이 어떤 함수를 가리키는지 알 수가
: 없죠. 이럴때는 분기 가능한 모든 함수에 브레이크 포인터를 거는 수밖에
: 없습니다.
:
: 2) 속도가 느리다.
: ANSI C 라이브러리에서 함수 포인터를 사용하는 대표적인 함수인
: qsort의 경우를 생각해 봅시다. 대소 비교를 위해서 fcmp라는 함수 포인터를
: 사용하는 데, 이건 qsort 내부에서 대소 비교가 필요할 때마다 매번 호출됩니다.
: 실제 정렬하는 시간보다 함수 호출을 위한 비용이 훨씬 크게 되어버립니다.
:
: 그래서 ANSI C++ STL에서 이런 문제점을 해결하기 위해 만든 것이
: 함수 포인터를 대신하는 함수 객체(function object)입니다.
: 함수 객체란 멤버 함수로 함수 하나만 들어 있는 매우 간단한 클래스입니다.
: 클래스이기 때문에 당연히 인라이닝할 수 있지요.
: 그래서, STL의 sort가 C의 qsort보다 무려 67000배나 빠릅니다!
:
: 콜백함수나 이벤트 핸들링과 같이 반드시 필요한 경우나,
: 함수 포인터를 써야만 코드가 매우 간결해지는 경우외에는 가능한 한 사용하지 않는 것이 좋습니다.
:
:
|