MSVC 2015优化了不稳定变量?

MSVC 2015优化了不稳定变量?,c,visual-studio,visual-c++,visual-studio-2015,side-effects,C,Visual Studio,Visual C++,Visual Studio 2015,Side Effects,我在MSVS2015中以发布模式编译了以下代码: #include "stdafx.h" #include "stdio.h" void f() { for (int i = 0; i < 10; i++) { volatile int var = 10; if (var) // Breakpoint can't be set { printf("Test\n"); // Breakpoint can

我在MSVS2015中以发布模式编译了以下代码:

#include "stdafx.h"
#include "stdio.h"

void f()
{
    for (int i = 0; i < 10; i++)
    {
        volatile int var = 10;
        if (var) // Breakpoint can't be set
        {
            printf("Test\n"); // Breakpoint can't be set
        }
    }
}

int main()
{
    f();
    return 0; // Second breakpoint
}
拆卸(释放):

#包括“stdafx.h”
#包括“stdio.h”
void f()
{
对于(int i=0;i<10;i++)
{
挥发性int-var=10;
if(var)
{
printf(“测试”);
}
}
}
int main()
{
00FE1040推式ebp
00FE1041 mov ebp,esp
00FE1043推送ecx
00FE1044推式esi
f();
00FE1045电影esi,0Ah
00FE104A nop字ptr[eax+eax]
00FE1050 mov德沃德ptr[ebp-4],0Ah
00FE1057 cmp dword ptr[ebp-4],0
00FE105B je干管+2Ah(0FE106Ah)
00FE105D推送偏移字符串“测试\n”(0FE20F8h)
00FE1062呼叫打印F(0FE1010h)
00FE1067添加esp,4
00FE106A子esi,1
00FE106D jne干管+10h(0FE1050h)
返回0;
00FE106F异或eax,eax
00FE1071 pop esi
}
00FE1072电动潜油电泵,ebp
00FE1074 pop ebp
00FE1075 ret

问题是行
if(var)
是否生成读取指令。如果没有,编译器将毫无希望地损坏,并且不符合要求。每个人都知道VS的情况。您确定在发布版本中设置断点是完全可能的吗?如果可能,请反汇编代码。根据我的经验,MS编译器不会删除像全局变量和静态变量那样的
volatile
访问。因此,作为一种解决方法,只需将
static
添加到
var
的定义中
var
是易变的,但没有外部链接,并且从不使用地址。我不知道是否符合标准,但在Windows ABI中,编译器正确地推断出值永远不会更改。
MSVS Version : 14.0.25431.01 Update 3
#include "stdafx.h"
#include "stdio.h"


void f()
{
    for (int i = 0; i < 10; i++)
    {
        volatile int var = 10;
        if (var)
        {
            printf("Test\n");
        }
    }
}


int main()
{
00FE1040  push        ebp  
00FE1041  mov         ebp,esp  
00FE1043  push        ecx  
00FE1044  push        esi  
    f();
00FE1045  mov         esi,0Ah  
00FE104A  nop         word ptr [eax+eax]  
00FE1050  mov         dword ptr [ebp-4],0Ah  
00FE1057  cmp         dword ptr [ebp-4],0  
00FE105B  je          main+2Ah (0FE106Ah)  
00FE105D  push        offset string "Test\n" (0FE20F8h)  
00FE1062  call        printf (0FE1010h)  
00FE1067  add         esp,4  
00FE106A  sub         esi,1  
00FE106D  jne         main+10h (0FE1050h)  
    return 0;
00FE106F  xor         eax,eax  
00FE1071  pop         esi  
}
00FE1072  mov         esp,ebp  
00FE1074  pop         ebp  
00FE1075  ret