novtable
Microsoft 專有的
這是__declspec的延伸的屬性。
這種形式的__declspec可套用至任何類別宣告中,但只應該套用到純虛擬介面類別,也就是無法被執行個體化各自獨立的類別。__declspec停止編譯器產生程式碼來初始化在 constructor(s) 和解構函式類別的 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();
}