Почему мы выделяем 12 байтов для каждой переменной? - PullRequest
1 голос
/ 07 ноября 2011

В Visual Studio 2010 Professional (x86, Windows 7):

... more
00DC1362 B9 39 00 00 00       mov         ecx,39h  
00DC1367 B8 CC CC CC CC       mov         eax,0CCCCCCCCh  
00DC136C F3 AB                rep stos    dword ptr es:[edi]  
    20:     int a = 3;
00DC136E C7 45 F8 03 00 00 00 mov         dword ptr [ebp-8],3  
    21:     int b = 10;
00DC1375 C7 45 EC 0A 00 00 00 mov         dword ptr [ebp-14h],0Ah  
    22:     int c;
    23:     c = a + b;
00DC137C 8B 45 F8             mov         eax,dword ptr [ebp-8]  
00DC137F 03 45 EC             add         eax,dword ptr [ebp-14h]  
00DC1382 89 45 E0             mov         dword ptr [ebp-20h],eax  
    24:     return 0;

Обратите внимание, что относительные адресационные переменные A и B не выровнены по размеру слова 4? Что здесь происходит?

Кроме того, почему мы пропускаем $ ebp - 8?

Отключение оптимизации покажет идеальную схему адресации.

Может кто-нибудь объяснить причину? Спасибо.


Смещение каждой переменной составляет 12 байтов. A -> B -> C Я допустил ошибку. Я имел в виду, почему мы пропускаем первые 8 байтов.

1 Ответ

1 голос
/ 07 ноября 2011

Вы смотрите на код, сгенерированный настройкой отладки по умолчанию.В частности, опция / RTC (включить проверку ошибок во время выполнения).Заполнение 0xcccccccc помогает диагностировать неинициализированные переменные, пробелы помогают диагностировать переполнение.

Нет особого смысла смотреть на этот код, вы не собираетесь его отправлять.Опять же, от сборки этой функции ничего не останется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...