【发布时间】:2019-11-19 10:17:40
【问题描述】:
众所周知,novtable 表示不为纯抽象类创建虚拟表。但是当我运行代码时,出了点问题:
#include <iostream>
using namespace std;
struct A{
virtual void fun() = 0;
};
struct __declspec(novtable) B{
virtual void fun() = 0;
};
struct C{
void fun(){}
};
struct _declspec(novtable) D : public A {};
int main(){
cout<<sizeof(int*)<<endl; //4
cout<<sizeof(A)<<endl; //4
cout<<sizeof(B)<<endl; //4
cout<<sizeof(C)<<endl; //1
cout<<sizeof(D)<<endl; //4
return 0;
}
A 和B 的大小相同,是否意味着novtable 没有用?
ps:用vs2019编译
【问题讨论】:
-
它禁止指向虚函数的指针列表。仍然在没有novtable的抽象类中使用,它会触发“纯虚函数调用”运行时错误。但仍然保留空间来存储对象中的 vtable 指针。它将被派生的具体类使用。这是一种微优化,在现代机器上几乎没有什么意义。
标签: c++ visual-c++ virtual