c++ - __attribute__((optimize(0))) 适用于 "recursively"吗?

标签 c++ gcc attributes

假设我想使用一个函数来测量运行时间,我想避免编译器优化表达式只是因为它认为它们什么都不做(它们没有,除了我想测量它们计算所需的时间)。我没有做奇怪的噱头,比如将它添加到另一个变量等,而是在 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/

相关文章:

java - 将 bean 写入 jsp 页面中元素的 title 属性

C++ 使用fstream从二进制文件中读取字符串

c++ - CUDA/C++ - 链接错误 : undefined reference to

c++ - 在函数中再分配一个变量会大大增加执行时间

php - 使用自定义属性更新 Eloquent 模型

.net - 将属性应用于匿名方法的语法?

C++ 新 - 内存替换和作用域解析

C++ - 从函数返回 vector

c++ - 与 Yeppp 一起表演!比 native 实现慢

linux - 无法使用 OpenSSL 1.0.2k 构建 APR-util 1.5.4