Назначение памяти локальным переменным

StackOverflow https://stackoverflow.com/questions/2542572

  •  23-09-2019
  •  | 
  •  

Вопрос

void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top