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();
}