代码之家  ›  专栏  ›  技术社区  ›  RedBlueThing

纯虚拟类上的DECLSPEC_NOVTABLE?

  •  1
  • RedBlueThing  · 技术社区  · 16 年前

    struct DECLSPEC_NOVTABLE IStuff : public IObject
    {
        virtual method1 () = 0;
        virtual method2 () = 0;
    };
    

    MSDN article 在这个__declspec扩展属性上说,添加这个家伙将删除构造和去构造vtable条目,从而导致“显著的代码大小减少”(因为vtable将被完全删除)。

    这对我来说没有多大意义。这些家伙是纯虚拟的,为什么编译器不默认这样做呢?

    文章还说,如果你这样做,然后尝试实例化其中一个东西,你将遇到运行时访问违规。但是当我用一些编译器(有或没有__declspec扩展)尝试这一点时,它们没有编译(正如我所料)。

    所以我想总结一下:

    • 编译器是否会删除vtable,而不管是纯虚拟接口,还是我错过了一些基本的东西?
    2 回复  |  直到 16 年前
        1
  •  2
  •   zildjohn01    16 年前

    编译器去掉了 参考 到vtable,这将是在课堂建设期间。因此,链接器可以优化它,因为代码中不再有对它的引用。

    顺便说一句,我已经养成了将空构造函数声明为 protected ,并使用微软的扩展 abstract 关键字,以避免在运行时发生访问违规。这样,编译器会在编译时捕获问题(因为只有基类可以通过受保护的构造函数实例化接口)。派生类当然会在以下期间填充vtable 它的 建筑。

        2
  •  1
  •   MSalters    16 年前

    对于一个愚蠢的编译器/链接器来说,这有点牵强。编译器不应插入对此vtable的任何引用,因为很明显不需要此vtable。编译器还可以标记引用,这样链接器就可以消除vtable,但这当然更复杂。