我在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
}
我认为volatile
关键字不允许编译器优化变量,但由于我无法设置断点,因此我无法检查变量的值和它看起来像是完全优化的。
我对volatile
和副作用有不正确的理解吗?
更新
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