假设我有这个层次结构:
class Super
{
public:
virtual void bar();
};
class Sub : public Super
{
public:
virtual void bar() override;
};
有没有办法让我在使用 virtual 关键字的情况下避免 vtables? (好奇心)我读过一些关于编译器优化的文章,当对象在编译期间已知时,它会消除 vtables,我不太确定,在谷歌上搜索了一段时间,但找不到任何答案,这是否意味着这些?
Sub sb;
sb.bar(); //avoids vtable?
Super& sr = sb;
sr.bar(); //avoids vtable?
Super* srp = &sb;
srp->bar(); //avoids vtable?
最佳答案
其中一位 gcc 开发人员拥有整个 series of blog posts about devirtualization .我认为他在 SO 上也很活跃,所以他有可能做出回应。
然而,去虚拟化主要是通过分析程序流和可能的类型来消除虚拟调度。我不认为它通常会删除虚拟表,但在第二篇文章中有一个示例,其中虚拟表被内联,然后可以在编译时通过不断传播完全评估。在这种情况下,编译器/链接器将程序转换为根本不使用该类,因此它不应包含任何对象或 vtable。
关于c++ - 编译时消除虚拟表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36712862/