假设我有这个层次结构:
class Super
{
public:
virtual void bar();
};
class Sub : public Super
{
public:
virtual void bar() override;
};
Run Code Online (Sandbox Code Playgroud)
尽管使用了虚拟关键词,我还有办法避免使用vtable吗?(好奇心)我已经读过一些关于编译器优化的东西,当编译期间对象被识别时消除了vtables,我不是很确定,一直在谷歌周围挖掘,但是找不到任何答案,所以它是否意味着这些?
Sub sb;
sb.bar(); //avoids vtable?
Super& sr = sb;
sr.bar(); //avoids vtable?
Super* srp = &sb;
srp->bar(); //avoids vtable?
Run Code Online (Sandbox Code Playgroud)
其中一位gcc开发人员有一系列关于虚拟化的博客文章.我认为他也很积极参与SO,所以他可能会有回应.
但是,虚拟化主要通过分析程序流和可能的类型来消除虚拟调度.我认为它一般不会删除虚拟表,但是在第二篇文章中有一个示例,其中虚拟内联,然后可以在编译时通过持续传播完全评估.在这种情况下,编译器/链接器将程序转换为根本不使用该类,因此它不应包含任何对象或vtable.