novtable

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

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

In Y

__declspec
C++ 關鍵字

顯示: