novtable
Блок, относящийся только к системам Майкрософт
Это расширенный __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
Завершение блока, относящегося только к системам Майкрософт
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по