[C++] 가상함수의 오버헤드

무슨 오버헤드가 있는가?
1.테이블 생성
virtual 함수를 클래스가 포함할 경우, 가상함수 테이블이란 메모리 블럭이 클래스에 정적으로 생성된다. 대개 배열의 형태를 띤다.
여기서 약간의 메모리를 먹긴 하지만,
객체를 생성할때마다 테이블이 더 늘어난다거나 하는 일은 벌어지지 않는다.

2.테이블에 대한 포인터 생성
위에서 생성한 테이블을 가리키는 포인터를, 생성하는 객체마다 몰래 넣어준다.
메모리 오버헤드가 다소 존재한다.

3.테이블 접근
virtual 함수를 호출할 경우 가상함수 테이블을 인덱싱해서 함수를 찾고 호출한다. 여기서 약간의 연산비용이 발생한다.


성능 낭비가 심한가?
사실 환경에 따라 다르다. 스펙이 너무 딸리는 임베디드용 소형 프로세서의 경우에는 상당한 오버헤드가 될 수 있으므로 자제하는 것이 바람직하다.
그러나 일반적인 데스크탑 환경 등에서는 그다지 의미가 없다. 메모리 점유도 미미하고, 연산비용도 파이프라이닝 처리로 없다시피하기 때문이다.

임베디드만 아니면 신경쓰지말고 사용하면 된다.


참조
[C++ 최적화], 커트 건서로스
http://m.egloos.zum.com/anster/v/2188896