作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在看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
对于临时和成员情况,看起来没有发生去虚拟化。那么,这是编译器的实现质量问题,还是有技术上的正当理由导致这样的结果?
最佳答案
只是错过了去虚拟化的案例。从第一个支持去虚拟化的版本VS 2013开始就是这样,其他编译器gcc、icc、clang都是去虚拟化。一般来说,最好明确指定 final
而不是依赖编译器迂腐地执行去虚拟化。用 final
标记 Impl.foo
可以在所有情况下进行优化。
关于c++ - 视觉 C++ : No devirtualization in obvious cases?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41948624/
在看visual c++(VS2017 RC)生成的代码看到简单情况下的动态分支(虚拟调用)时,我感到非常惊讶。 所以我用编译器资源管理器尝试了以下代码: struct Base { virtua
我是一名优秀的程序员,十分优秀!