Распределение памяти локальных переменных - PullRequest
0 голосов
/ 30 марта 2010
void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}

Мы должны помнить, что память может только быть адресованным в нескольких словах размер. Слово в нашем случае составляет 4 байта, или 32 бита. Итак, наш 5-байтовый буфер действительно собираюсь взять 8 байт (2 слова) памяти, и наш 10-байтовый буфер собирается взять 12 байтов (3 слова) объем памяти. Вот почему SP вычитается на 20.

Почему это не ceil ((5 + 10) / 4) * 4 = 16?

Ответы [ 2 ]

5 голосов
/ 30 марта 2010

Потому что отдельные переменные должны быть выровнены. В предложенной формуле вы выровняете только первую переменную в стеке, оставив следующие переменные невыровненными, что отрицательно сказывается на производительности.

Это также известно как «упаковка» и может быть сделано в C / C ++ с прагмами, но полезно только в очень специфических случаях и может быть опасным как для производительности, так и как причина потенциальных ловушек во время выполнения. Некоторые процессоры будут генерировать сбои при невыровненных доступах во время выполнения, что приведет к сбою вашей программы.

1 голос
/ 30 марта 2010

Переменные в вашей архитектуре выровнены индивидуально. buffer1 округляется до 8, а buffer2 до 12, поэтому оба их начальных адреса выровнены по 4 байта Итак, 8 + 12 = 20.

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