关闭 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;
}
在-O3
中循环展开,但-O1
和-O2
保持循环。
我想知道如何关闭以下循环的优化。我已经搜索并尝试了一些标志但没有工作。谢谢
#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;
}
在-O3
中循环展开,但-O1
和-O2
保持循环。