2010-03-30 6 views
0
void function(int a, int b, int c) { 
    char buffer1[5]; 
    char buffer2[10]; 
} 

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

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

ответ

5

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

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

1

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

Смежные вопросы