gpt4 book ai didi

c++ - 在优化阶段内联虚拟方法和静态分析

转载 作者:行者123 更新时间:2023-11-30 01:38:12 26 4
gpt4 key购买 nike

我正在阅读 "Optimized C++" book 并且在那里被告知编译器能够在成功的静态分派(dispatch)期间执行像内联虚拟方法这样的优化(当编译器能够看到不需要动态分派(dispatch)时)。但是,这似乎不起作用。

The following code说明了由于某种原因无法完成的简单情况:

#include <iostream>

class A {
public:
__attribute__((always_inline))
virtual int f(const int x) {
if (x > 6) {
return x * 5;
} else {
return x - 5;
}
}
};

class B : public A {
public:
__attribute__((always_inline))
int f(const int x) override {
if (x > 10) {
return x * 7;
} else {
return x - 2;
}
}
};

int main() {
A *a = new B;
int n;
std::cin >> n;
return a->f(n);
}

即使使用 always_inline 和 -O3,这也会导致函数调用和虚拟表生成(但是,这种优化通常甚至在 -O1 级别执行)。问题是为什么编译器在这样一个非常简单的情况下这样做,然后我们甚至说要内联它:编译器能够看到不需要动态调度,因为我们知道变量的确切类型(它是 B) 并且在整个运行过程中不会发生变化,从编译时就可以看出来。

最佳答案

gcc 没有堆省略,这是一种删除不需要的堆分配的做法。您可以在 this small example 中亲自查看:

int main() {
int *Value = new int(10);
return *Value;
}

这意味着在您的示例中,它无法查看 a 并进行适当优化以删除虚拟表。请注意,gcc 确实会删除您的虚拟表 don't use heap allocations :

// ...
B b;
A &a = b;
// ...

作为最后的说明:clang 确实支持堆省略,可以看出in the assembly没有任何虚拟表。

关于c++ - 在优化阶段内联虚拟方法和静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48450143/

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