【发布时间】: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