Я компиляции ниже программы в C:Связаны ли переменные стека в виртуальной памяти?
void function(int a, int b, int c) {
char buffer1[11];
char buffer2[3];
char buffer3[1];
char buffer4[1];
}
void main() {
function(1,2,3);
}
с помощью команды:
gcc -m32 -fno-asynchronous-unwind-tables -fno-stack-protector -S -o example1.s example1.c
Ниже выход я получаю:
.file "example1.c"
.text
.globl function
.type function, @function
function:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
leave
ret
.size function, .-function
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
pushl $3
pushl $2
pushl $1
call function
addl $12, %esp
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.9.2-10ubuntu13) 4.9.2"
.section .note.GNU-stack,"",@progbits
Линия subl $ ,% esp указывает, что в стеке выделено 16 байт.
Однако, как и в разных учебниках, я вижу, что пространство стека обычно выделяется в блоках по 4 байта.
Почему поведение я вижу другим?
Я бегу 64 битной системы Ubuntu: -
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
stepping : 9
microcode : 0x1b
cpu MHz : 1202.636
cache size : 3072 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 2
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
bugs :
bogomips : 4988.46
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:
Может кто-нибудь, пожалуйста, помогите мне понять это.
Я упомянув ниже вопрос: How is memory allocated for stack variables? , но мне не удалось найти конкретный ответ.
Редактировать: 1) Я хотел бы понять, должен ли общий стек просто выравниваться с границей 4/8/16 байтов или каждой переменной стека. 2) Есть ли какое-либо ограничение для типов локальных переменных, которые могут быть объединены в слово памяти стека?
Не знаете, в чем проблема, вы объявили 16 байтов местных жителей, и вы получили 16 байт, что кратно 4.Да, компилятор может организовать местных жителей по своему усмотрению, а выравнивание для 'char' -' 1', чтобы они могли быть упакованы смежно. – Jester
@Jester Я отредактировал вопрос. Не могли бы вы сейчас проверить – nkvp
соглашение о вызове может потребоваться или потребовать, но я не думаю, что для набора инструкций требуется выравнивание. Эти выравнивания помогают производительности, а ebi для этого требует также, но в конце концов это конкретные параметры компилятора, версии, командной строки, независимо от того, что диктует генерируемый код. И нет причин, по которым любые два компилятора должны были бы сделать то же самое. –