这可能是习惯性的编程冗余。我注意到在标题中定义的一堆接口上的 DECLSPEC_NOVTABLE ( __declspec(novtable) ):
struct DECLSPEC_NOVTABLE IStuff : public IObject
{
virtual method1 () = 0;
virtual method2 () = 0;
};
关于这个 __declspec 扩展属性的MSDN 文章说,添加这个人将删除构造和析构函数 vtable 条目,从而导致“显着减少代码大小”(因为 vtable 将被完全删除)。
这对我来说没有多大意义。这些家伙是纯虚拟的,为什么编译器不默认这样做呢?
这篇文章还说,如果你这样做,然后尝试实例化这些东西之一,你将遇到运行时访问冲突。但是当我用一些编译器(有或没有 __declspec 扩展名)尝试这个时,它们不会编译(正如我所预料的那样)。
所以我想总结一下:
- 对于纯虚拟接口,编译器是否会删除 vtable,或者我在这里错过了一些基本的东西?
- MSDN 文章在说什么?