我有这个宏的GCC和CLANG工作得很好
#if defined(__clang__)
#define BENCHMARK_DONT_OPTIMIZE [[clang::optnone]]
#elif defined(__GNUC__) || defined(__GNUG__)
#define BENCHMARK_DONT_OPTIMIZE [[gnu::optimize(0)]]
#elif defined(_WIN32)
#define BENCHMARK_DONT_OPTIMIZE __pragma(optimize("",off))
#else
#define BENCHMARK_DONT_OPTIMIZE
#endif
然而对于MSVC,我尝试了__pragma(optimize("",off))
甚至#pragma optimize("",off)
的所有可能组合,但都无济于事。似乎尽管MSVC接受这两种语法,但它并没有根据它们的文档处理它们。
对于下面的测试,MSVC程序集看起来完全相同,而对于GCC和CLANG,它们使用简单的N(N-1)/2
公式折叠了第一个实现。
template< typename SumType >
struct Sum {
SumType operator() ( SumType size ) {
SumType sum = 0;
for ( SumType j=0; j<size; ++j ) {
sum += j;
}
return sum;
}
};
template< typename SumType >
struct SumNoOpt : public Sum<SumType> {
BENCHMARK_DONT_OPTIMIZE SumType operator() ( SumType size ) {
SumType sum = 0;
for ( SumType j=0; j<size; ++j ) {
sum += j;
}
return sum;
}
};
template struct Sum<size_t>;
template struct SumNoOpt<size_t>;
我到底做错了什么?
在Godbolt link上进行完整测试
1条答案
按热度按时间ggazkfy81#
**#pragma optimize(“",off)**以及__pragma和_Pragma变体不是语句,而是文件级注解。
它应该出现在源文件中,位于函数和(假设优化构建)之间,上面的一切都将被优化,下面的一切都不会被优化,直到文件末尾或**#pragma optimize(“",on)**注解。
实际上,这是调试VC++应用程序的唯一方法-完全调试构建不是一个好的可行的方法-加载、运行和调试太慢,而且内存使用太多。因此,释放构建并在可疑文件中散布此杂注,然后进行调试