gpt4 book ai didi

c++ - 视觉 C++ : No devirtualization in obvious cases?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:08 24 4
gpt4 key购买 nike

在看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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com