РЕДАКТИРОВАТЬ: Согласно вашей новой информации, которую вы забыли инициализировать переменную, поведение ожидается. Вы читаете мусорную память.
Теперь, даже если вы инициализировали переменную, вы все равно могли бы воспроизвести это поведение, не используя его таким образом, который влияет на наблюдаемое поведение программы. Это то, к чему относился мой первоначальный ответ - и я оставлю его для дальнейшего использования.
Вы на самом деле используете x
? Если вы просто инициализируете его, оптимизатор, скорее всего, исключит все это.
Если это не влияет на наблюдаемое поведение программы, оптимизатор может свободно вырезать что-либо из двоичного файла.
Часы могут также лгать вам, я видел, что это происходит в режиме выпуска.
Можете ли вы опубликовать минимальный код, который воспроизводит проблему?
Если вы протестируете его с каким-либо выводом, то есть:
cout << x;
Я уверен, вы увидите, что x
это 0
.
EDIT:
Просто чтобы прояснить ситуацию:
int main()
{
int x = 0;
x = 3;
return 0;
}
будет переводиться в (в режиме релиза, с полной оптимизацией):
00401000 xor eax,eax
00401002 ret
Переменная не только не назначена, она даже не существует ; в отличие от отладочной версии:
00411370 push ebp
00411371 mov ebp,esp
00411373 sub esp,0CCh
00411379 push ebx
0041137A push esi
0041137B push edi
0041137C lea edi,[ebp-0CCh]
00411382 mov ecx,33h
00411387 mov eax,0CCCCCCCCh
0041138C rep stos dword ptr es:[edi]
0041138E mov dword ptr [x],0
00411395 mov dword ptr [x],3
0041139C xor eax,eax
где переменная x создается и присваивается дважды (см. mov dword ptr [x],0
и mov dword ptr [x],3
).
Если наблюдаемый результат изменяется с помощью переменной, то есть ::
int main()
{
int x = 0;
x = 3;
cout << x;
return 0;
}
сгенерированный двоичный файл будет выглядеть так:
00401000 mov ecx,dword ptr [__imp_std::cout (40203Ch)]
00401006 push 3
00401008 call dword ptr [__imp_std::basic_ostream<char,std::char_traits<char>
0040100E xor eax,eax
видите, что даже при этом x
на самом деле не генерируется, а вместо этого 3
помещается в стек и печатается напрямую.
Но наблюдаемое поведение в этом случае остается тем же, поскольку 3
печатается. Для пользователя не имеет значения, печатается ли значение x
, которое должно быть 3
, или печатается 3
напрямую,
Суть заключается в следующем: если поведение программы не изменяется некоторыми операторами, они исключаются. В вашем случае переменная x
даже не создается.