我正在寻找一个编译器标志,这将允许我阻止编译器在这样的代码中优化掉循环:
void func() {
std::unique_ptr<int> up1(new int(0)), up2;
up2 = move(up1);
for(int i = 0; i < 1000000000; i++) {
if(up2) {
*up2 += 1;
}
}
if(up2)
printf("%d", *up2);
}
在C ++和Rust代码中。我试图在速度和运行这个循环方面比较类似的代码部分,而不仅仅是评估整体结果很重要。由于Rust静态地保证指针所有权没有被移动,所以它不需要对循环的每次迭代进行空指针检查,因此我会想象如果循环无法针对任何情况进行优化,它将产生更快的代码原因。
Rust使用LLVM后端进行编译,所以我最好也将它用于C ++。
答案 0 :(得分:2)
在Rust中,您可以使用test::black_box
。
在C ++中(使用gcc)asm volatile("" : "+r" (datum));
。请参阅this。
答案 1 :(得分:1)
避免让编译器优化离开循环的一种典型方法是在编译时使它们的边界不确定。在此示例中,不是循环到10000000
,而是循环到从stdin
或argv
读取的计数。