c++ - 编译时消除虚拟表?

标签 c++ oop c++11

假设我有这个层次结构:

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/

相关文章:

c++ - C++ 中的抽象语法树表示

java - 我们为什么选择内部类或者使用内部类的主要优点是什么

c++ - 递归尾随返回类型的名称解析

c++ - 使所有 TU 都知道静态对象字段的值

c++ - 如何获取 n 行的整数直到\n

c++ - 无需重新插入变量的多个 bool 表达式

c++ - 这里是否为这个模板函数生成了不同的实例?

c# - 在运行时动态创建按钮并存储,在 C# 中永久检索它

c++ - 适用于 iOS 和 Android 的 QT C++ 中的 HTTPS 请求

c++ - 类定义应该放在全局还是局部范围内?