是否有一个 g++ 等价于 Visual Studio 的 __declspec(novtable)?

16

是否有 g++ 相当于 Visual Studio 的 __declspec(novtable) 参数?

基本上,在纯虚基类中,可以使用 __declspec(novtable) 参数来抑制为基类创建 vtable ,以及在构造函数/析构函数中初始化/反初始化 vtable 代码。例如:

class __declspec(novtable) PureVirtualBaseClass
{
    public: 
       PureVirtualBaseClass(){}
       virtual ~PureVirtualBaseClass() = 0;
};

请参见Paul DiLascia的文章以获取更多信息。另外,还可以查看我的相关问题


只是好奇:对于PureVirtualBaseClass丢弃vtable似乎是一种微观优化,而且通常也非常小。想要这样做的原因是什么? - Managu
1
阅读DiLascia的文章,他比我更好地解释了想要做到这一点的原因。 - oz10
今天在MSDN上发现了这篇文章:http://msdn.microsoft.com/en-us/library/k13k85ky.aspx,其中建议使用__declspec(novtable)可以显著减小程序的大小。 - oz10
1
整个程序优化难道不会让编译器删除任何未被实例化的类的虚函数表吗? - Dirk Holsopple
1个回答

9
我认为并没有这样的内容 - 如果有的话,它会在GCC手册的type attributes page下列出。GCC使用类型属性向类型添加额外的注释(如对齐和填充),但是在那里没有等效于__declspc(novtable)的类型属性。
我也没有看到任何与此优化相关的command line options编译器标志。

1
好久不见了。这个答案还适用吗? - Quest
我相信现在的gcc已经有了-fdevirtualize开关,它在-O2优化中。 - Dave
1
@Dave 不是的,根据 -fdevirtualize 的文档 https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-fdevirtualize ,那是一个完全不同的优化。 - Adam Rosenfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接