假设我想使用一个函数来测量运行时间,我想避免编译器优化表达式只是因为它认为它们什么都不做(它们没有,除了我想测量它们计算所需的时间)。我没有做奇怪的噱头,比如将它添加到另一个变量等,而是在 GCC 中发现了 __atribute__((optimize(0)))
。但是,假设我有这段代码:
__attribute__((optimize(0))) void test(int n) {
while (n--) {
foo();
}
}
int main() {
std::cout << Timer::measure(test).count() << "ms\n";
}
该属性是否也会阻止编译器优化函数 foo() 内的代码?我真的只是想测试一些运行时并且可靠且相对容易地阻止编译器完全删除代码(我希望它尽可能地优化代码,但不要删除它,因为它什么都不做!) .
这有意义吗?提前致谢!
最佳答案
我只是觉得我可以做一个实验(为什么我没有早点想到),这是我所做的:
// toggle this
// __attribute__((optimize(0)))
void waste_time() { for (unsigned i = 100000; i--; ); }
// always leave this on
__attribute__((optimize(0)))
void test() {
for (unsigned i = 1000; i--; ) {
waste_time();
}
}
int main() {
std::cout << Timer::measure(test).count() << "ms\n";
}
我用 -O3 发现了什么:
waste_time no optimizations: 196.972ms (obviously the loop is not optimized)
waste_time w/ optimizations: 0.001995ms (loop is optimized)
对我而言,这非常清楚,__attribute__
不会“传播”到嵌套函数调用,因此即使 test() 具有指定的属性,waste_time() 仍将得到优化。
关于c++ - __attribute__((optimize(0))) 适用于 "recursively"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52505499/