Выравнивание данных — это требование ЦП, что означает, что величина выравнивания меняется от ЦП к другому, имейте это в виду.
Говоря о выравнивании данных в стеке, gcc
, например, поддерживает выравнивание данных с помощью параметра -mpreferred-stack-boundary=n
, где данные будут выравниваться по 2^n
. По умолчанию значение n
равно 4, что делает выравнивание стека 16-байтовым.
Это означает, что вы обнаружите, что выделяете 16 байтов в памяти стека, хотя то, что вы явно выделили, было просто целым числом.
int main()
{
char ar[6] = {1,2,3,4,5,6};
int x = 10;
int y = 12 + (int) ar[1] + x;
return y;
}
Компиляция этого кода с помощью gcc на моем процессоре дает следующую сборку (публикация только инструкции по размещению стека):
subl $32, %esp
Но почему 32? мы выделяем данные, которые умещаются точно в 16 байт. Ну, есть 8 байтов, которые gcc нужно сохранить для leave
и ret
, что делает общую необходимую память 24.
НО, требование выравнивания составляет 16 байтов, и поэтому gcc необходимо выделить пространство стека, чтобы оно было восполнено. кусков по 16 байт; преобразование этих 24 байтов в 32 решает проблему.
У вас будет достаточно места для ваших переменных, для ret
и leave
, и оно состоит из двух фрагментов по 16 байт.
person
Fingolfin
schedule
24.03.2013