novtable
Specyficzne dla firmy Microsoft
Jest to atrybut rozszerzony __declspec.
Ta forma __declspec może być stosowana do wszelkich deklaracji klas, ale powinien być stosowany tylko do czystych klas interfejsów, to znaczy klas, które nigdy nie będą posiadały własnych wystąpień.__declspec powstrzymuje kompilator od generowania kodu inicjowania vfptr w konstruktorze(ach) i destruktorze klasy.W wielu przypadkach spowoduje to usunięcie tylko odwołań do vtable, które są skojarzone z klasą i w efekcie konsolidator usunie je.Użycie tej formy __declspec może spowodować znaczne zmniejszenie rozmiaru kodu.
Jeśli użytkownik spróbuje utworzyć wystąpienie klasy oznaczone novtable i następnie uzyskać dostępu do członka klasy, otrzyma błąd naruszenia zasad dostępu (AV).
Przykład
// 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();
}