Я просто заметил некоторый странный код ассемблера пустого основного метода.
//filename: main.c
void main()
{
}
дизассемблирование:
push ebp
mov ebp,esp
sub esp,0C0h; why on the earth is it reserving 192 bytes?
push ebx
push esi
push edi ; good compiler. Its saving ebx, esi & edi values.
lea edi,[ebp-0C0h] ; line 1
mov ecx,30h ; line 2
mov eax,0CCCCCCCCh ; line 3
rep stos dword ptr es:[edi] ; line 4
xor eax,eax ; returning value 0. Code following this line is explanatory.
pop edi ; restoring the original states of edi,esi & ebx
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
Четыре указанные вами строки кода представляют собой отладочную сборку, очищающую пространство локальных переменных с помощью специального значения «clear» ( 0xCCCCCCCC
).
Я не уверен, почему 192 байта кажутся мертвыми, но это может быть VC ++, создающий некое защитное пространство в вашей области локальной переменной, чтобы попытаться обнаружить разбиение стека.
Вы, вероятно, получите совсем другой результат, если переключитесь с отладки на сборку Release.
Грег уже объяснил, как компилятор генерирует код для диагностики неинициализированных локальных переменных, включенный опцией компиляции /RTCu. Значение 0xcccccccc было выбрано для того, чтобы оно было отличительным и легко распознавалось в отладчике. А также для того, чтобы программа завершалась при разыменовании неинициализированного указателя. А также для того, чтобы программа завершалась, когда она выполняется как код. 0xcc довольно идеально подходит для выполнения всех этих задач, это опкод инструкции INT3.
Загадочные 192 байта, выделенные в стековой рамке, предназначены для поддержки функции Edit + Continue, /ZI compile option. Она позволяет редактировать код, пока активна точка останова. При добавлении локальных переменных в функцию эти 192 байта выделяются для того, чтобы обеспечить пространство для добавленных локальных переменных. Превышение этого пространства заставит IDE перестроить программу.
Btw: это может вызвать проблему, если вы используете рекурсию в своем коде. Отладочная сборка будет бомбить с именем этого сайта намного быстрее. Обычно это не является большой проблемой, если вы отлаживаете с практическими размерами наборов данных.