novtable
Microsoft 전용
__declspec 확장 특성입니다.
이 형태의 __declspec는 모든 클래스 선언에 적용할 수 있지만, 자체적으로 인스턴스화되지 않을 클래스인 순수 인터페이스 클래스에만 적용해야 합니다. __declspec는 컴파일러가 클래스의 생성자와 소멸자에서 vfptr을 초기화하는 코드를 생성하지 않도록 합니다. 대부분의 경우 이렇게 하면 클래스와 연결된 vtable에 대한 참조만 제거되므로 링커가 이를 제거합니다. 이 형태의 __declspec를 사용하면 코드 크기를 상당히 줄일 수 있습니다.
novtable로 표시된 클래스를 인스턴스화한 다음 클래스 멤버에 액세스하려고 하면 AV(액세스 위반)가 발생합니다.
예제
// novtable.cpp
#include <stdio.h>
struct __declspec(novtable) X {
virtual void mf();
};
struct Y : public X {
void mf() {
printf_s("In Y\n");
}
};
int main() {
// X *pX = new X();
// pX->mf(); // Causes a runtime access violation.
Y *pY = new Y();
pY->mf();
}