关闭 C++ 循环优化

turn off c++ loop optimization

我想知道如何关闭以下循环的优化。我已经搜索并尝试了一些标志但没有工作。谢谢

#include <iostream>

int fun(int i) {return ++i;};

int main ()
{
    int res = 0;

    for (long i = 0; i < 10000; i++)
    {
        res += fun(i);
    }
    std::cout << res;
}

-O1 将去除循环并直接硬编码结果。我想使用 -O3 但关闭了此优化。

您可以使用类似 Google Benchmark 的 DoNotOptimize() 功能。这个函数使用一个空的 asm 块来欺骗编译器,让编译器知道给定的变量是从中读取的。改编自 here:

template <class Tp>
[[gnu::always_inline]] inline void DoNotOptimize(Tp const& value) {
  asm volatile("" : : "r,m"(value) : "memory");
}

template <class Tp>
[[gnu::always_inline]] inline void DoNotOptimize(Tp& value) {
#if defined(__clang__)
  asm volatile("" : "+r,m"(value) : : "memory");
#else
  asm volatile("" : "+m,r"(value) : : "memory");
#endif
}

然后,你可以欺骗编译器,告诉它在每次迭代中读取res

#include <iostream>

int main ()
{
    int res = 0;

    ::DoNotOptimize(res);
    for (long i = 0; i < 10; i++)
    {
        res++;
        ::DoNotOptimize(res);
    }
    std::cout << res;
}

Compiler Explorer link

-O3中循环展开,但-O1-O2保持循环。