【发布时间】:2009-03-12 00:58:19
【问题描述】:
这可能是习惯性的编程冗余。我注意到在标题中定义的一堆接口上的 DECLSPEC_NOVTABLE ( __declspec(novtable) ):
struct DECLSPEC_NOVTABLE IStuff : public IObject
{
virtual method1 () = 0;
virtual method2 () = 0;
};
此 __declspec 扩展属性上的 MSDN article 表示添加此人将删除构造和析构函数 vtable 条目,从而导致“显着减少代码大小”(因为 vtable 将被完全删除)。
这对我来说没有多大意义。这些家伙是纯虚拟的,为什么编译器不默认这样做呢?
文章还说,如果您这样做,然后尝试实例化其中一件事情,您将遇到运行时访问冲突。但是当我用一些编译器(有或没有 __declspec 扩展)尝试这个时,它们不能编译(正如我所预料的那样)。
所以我想总结一下:
- 编译器是否会剔除 vtable 而不管纯虚拟接口,还是我在这里遗漏了一些基本内容?
- MSDN 文章在谈论什么?
【问题讨论】:
标签: c++ visual-c++ msdn pure-virtual