我正在阅读在进行基准测试时防止编译器优化,其中描述了Chandler Carruth的演讲CppCon 2015:Chandler Carruth“调整C ++:基准测试,CPU和编译器!哦,我的天啊!”中的和如何影响编译器。
从阅读中,我认为如果我有一个像“g”(
如何重写
从阅读中,我认为如果我有一个像“g”(
val
)这样的输入约束条件,则编译器将无法优化掉val
。但是在下面的g()
中,没有生成任何代码。为什么?如何重写
doNotOptimize()
以确保为g()
生成代码?template <typename T>
void doNotOptimize(T const& val) {
asm volatile("" : : "g"(val) : "memory");
}
void f() {
char x = 1;
doNotOptimize(&x); // x is NOT optimized away
}
void g() {
char x = 1;
doNotOptimize(x); // x is optimized away
}
g
将值作为const ref传递给doNotOptimize
,编译器可以假设x
或更好的是val
不会改变,因此它可以优化调用。另一方面,f
将一个const指针传递给doNotOptimize
,所以x
确实可能会改变。 - t.niese