novtable
Specyficzne dla firmy Microsoft
Jest __declspec
to atrybut rozszerzony.
Ta forma __declspec
może być stosowana do dowolnej deklaracji klasy, ale powinna być stosowana tylko do czystych klas interfejsów, czyli klas, które nigdy nie zostaną utworzone samodzielnie. Element __declspec
zatrzymuje kompilator generowania kodu w celu zainicjowania pliku vfptr w konstruktorach i destruktorze klasy. W wielu przypadkach spowoduje to usunięcie jedynych odwołań do tabeli wirtualnej skojarzonej z klasą, a tym samym konsolidator go usunie. Użycie tej formy może spowodować znaczne zmniejszenie rozmiaru __declspec
kodu.
Jeśli spróbujesz utworzyć wystąpienie klasy oznaczonej jako , novtable
a następnie uzyskasz dostęp do składowej klasy, otrzymasz naruszenie 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();
}
In Y
END Microsoft Specific
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla