gpt4 book ai didi

c++ - `__declspec(novtable)`没有用吗?

转载 作者:行者123 更新时间:2023-11-27 23:36:22 26 4
gpt4 key购买 nike

我们知道,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;
}

AB 的大小相同,那是不是意味着novtable 没用了?

ps:用vs2019编译

最佳答案

learn.microsoft.com阅读:

The __declspec(novtable) stops the compiler from generating code to initialize the vfptr in the constructor(s) and destructor of the class. In many cases, this removes the only references to the vtable that are associated with the class and, thus, the linker will remove it.

换句话说,vfptr 仍将作为数据成员存在,但其值不会被初始化。例如,如果您设法调用一个纯虚函数,而不是像“纯虚函数调用”这样的消息,您将得到一个段错误。

The size of A and B are same, does that means novtable no use?

__declspec(novtable)的目的不是减小对象大小,而是删除一些不需要的初始化代码和不需要的vtable两者都需要。

关于c++ - `__declspec(novtable)`没有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58931606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com