__attribute __((optimize(0)))是否“递归”应用?

时间:2018-09-25 19:32:20

标签: c++ gcc attributes

说我想使用一个函数来衡量运行时间,我想避免编译器仅仅因为认为表达式什么都不做而优化了表达式(它们不做,除了我要测量它们花费多长时间来计算之外)。我没有做像添加到另一个变量之类的怪异like头,而是在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()中的代码?我真的只是在尝试可靠地测试一些运行时,并且相对容易地防止编译器完全删除代码(我希望它尽可能地优化代码,而不是删除它,因为它什么都不做!)

这有意义吗?预先感谢!

1 个答案:

答案 0 :(得分:1)

我只是想我可以做一个实验(为什么我不早想到这一点),这就是我所做的:

// 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()仍将得到优化。