【问题标题】:Visual C++ : No devirtualization in obvious cases?Visual C++:在明显的情况下没有去虚拟化?
【发布时间】:2017-01-31 02:08:14
【问题描述】:

在看visual c++(VS2017 RC)生成的代码,看到简单情况下的动态分支(虚调用)时,我很惊讶。

所以我用编译器资源管理器尝试了以下代码:

struct Base
{
  virtual void foo() = 0;
};

struct Impl : Base
{
void foo() override;
};

Impl g_impl;
void globalCall()
{
  g_impl.foo();
}

void localCall()
{
  Impl i;
  i.foo();
}

void tempCall()
{
  Impl().foo(); // dynamic branching generated!
}

struct Class
{
  void memberCall();
  Impl impl;
};

void Class::memberCall()
{
  impl.foo(); // dynamic branching generated!
} 

编译器资源管理器链接: https://godbolt.org/g/RmUku2

对于临时情况和成员情况,似乎没有发生去虚拟化。那么这是编译器的实现质量问题,还是这种结果存在技术上的正当理由?

【问题讨论】:

  • 您是否尝试添加final

标签: c++ visual-studio compiler-optimization


【解决方案1】:

只是错过了去虚拟化的案例。从第一个支持去虚拟化的版本,即 VS 2013 开始就是这样。其他编译器 gcc、icc 和 clang 在所有情况下都执行去虚拟化。一般来说,最好明确指定final,而不是依赖编译器来迂腐地执行去虚拟化。用final 标记Impl.foo 可以在所有情况下进行优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-23
    • 2015-02-15
    • 2015-04-28
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    相关资源
    最近更新 更多