c++ 是否有可用于Microsoft Visual Studio编译器的单个函数“不优化”属性?

5us2dqdw  于 2023-03-05  发布在  其他
关注(0)|答案(1)|浏览(180)

我有这个宏的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上进行完整测试

ggazkfy8

ggazkfy81#

**#pragma optimize(“",off)**以及__pragma和_Pragma变体不是语句,而是文件级注解。

它应该出现在源文件中,位于函数和(假设优化构建)之间,上面的一切都将被优化,下面的一切都不会被优化,直到文件末尾或**#pragma optimize(“",on)**注解。
实际上,这是调试VC++应用程序的唯一方法-完全调试构建不是一个好的可行的方法-加载、运行和调试太慢,而且内存使用太多。因此,释放构建并在可疑文件中散布此杂注,然后进行调试

相关问题