__attribute__(优化(0))) 是否适用于"recursively"?

Does __attribute__((optimize(0))) apply "recursively"?

本文关键字:recursively 适用于 是否 优化 attribute      更新时间:2023-10-16

假设我想使用一个函数来测量运行时,我想避免编译器仅仅因为它认为它们什么都不做而优化表达式(它们没有,除了我想测量它们需要多长时间来计算(。我没有做奇怪的噱头,比如把它加到另一个变量中等,而是在 GCC 中发现了__atribute__((optimize(0)))。但是,假设我有以下代码:

__attribute__((optimize(0))) void test(int n) {
while (n--) {
foo();
}
}
int main() {
std::cout << Timer::measure(test).count() << "msn";
}

该属性是否会阻止编译器优化函数 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() << "msn";
}

我在 -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(( 仍然会被优化。