Я ищу флаг компилятора, который позволит мне предотвратить оптимизацию компилятором цикла в коде следующим образом:
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 ++.
В Rust вы можете использовать test::black_box
.
В C ++ (с использованием gcc) asm volatile("" : "+r" (datum));
, Увидеть этот.
Один из типичных способов избежать оптимизации циклов компилятором — сделать их границы неопределенными во время компиляции. В этом примере, а не в цикле до 10000000
, цикл до счета, который читается из stdin
или же argv
,