防止优化器在visual studio中优化变量

use*_*313 6 c++ visual-studio visual-c++ c++11 visual-studio-2013

有时在编写基准时,我发现使用"不透明"函数会阻止优化器完全删除变量.在gcc和clang上我有一个使用内联汇编的实现,它似乎在我到目前为止所测试的所有情况下都能正常工作.这是我感兴趣的一个简单例子(关于godbolt的例子):

template<class T> 
void opaque(T&& t)
{
    asm volatile("" : "+r" (t));
}

int test(int a) { return a + 5; }

int main()
{
    int a = 10;
    opaque(a);
    return test(a);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码生成以下程序集:

movl    $10, %eax
addl    $5, %eax
ret
Run Code Online (Sandbox Code Playgroud)

而没有它产生的不透明功能:

movl    $15, %eax
ret
Run Code Online (Sandbox Code Playgroud)

我如何为visual studio编译器(特别是2013)编写等效的opaque函数?

小智 1

我知道回答这个问题已经很晚了,但我也遇到了类似的问题。我的星座是 VSCode + CMake + MSVC,我做了一些研究并发现了以下 Visual Studio 文章:https://developercommunity.visualstudio.com/t/compiler-optimizes-out-some-variables-in-release- b/276808

如果您担心编译器在基准测试的根部进行优化,我认为有两种有效的通用方法: 1. 策略性地使用 易失性变量来防止上述优化启动。 2. 禁用围绕“main”的优化" 带有 #pragma optimize("", off) / #pragma optimize("", on) 的函数。我更喜欢选项 2,我发现其中的意图更明确。

我在主函数周围使用 #pragma optimize("", on / off) 测试了该选项,它确实有效。

当然,另一个选项是使用编译器的 /Od 标记完全禁用优化。(https://learn.microsoft.com/en-us/cpp/build/reference/od-disable-debug?view=msvc-170