Есть ли способ отключить оптимизацию цикла при компиляции C ++ и Rust?

Я ищу флаг компилятора, который позволит мне предотвратить оптимизацию компилятором цикла в коде следующим образом:

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

Решение

В Rust вы можете использовать test::black_box.

В C ++ (с использованием gcc) asm volatile("" : "+r" (datum));, Увидеть этот.

2

Другие решения

Один из типичных способов избежать оптимизации циклов компилятором — сделать их границы неопределенными во время компиляции. В этом примере, а не в цикле до 10000000, цикл до счета, который читается из stdin или же argv,

1

По вопросам рекламы [email protected]