Я пытаюсь выяснить, как происходит пространство между каждым элементом структуры компилятора. В этом примере:
struct s{
int a,b,c;
};
struct s get(int a){
struct s foo = {.a=a,.b=a+1,.c=a+2};
return foo;
}
скомпилировано с cc -S a.c
:
.file "a.c"
.text
.globl get
.type get, @function
get:
.LFB0:
pushq %rbp
movq %rsp, %rbp
movl %edi, -36(%rbp)
movl -36(%rbp), %eax
movl %eax, -24(%rbp)
movl -36(%rbp), %eax
addl $1, %eax
movl %eax, -20(%rbp)
movl -36(%rbp), %eax
addl $2, %eax
movl %eax, -16(%rbp)
movq -24(%rbp), %rax
movq %rax, -12(%rbp)
movl -16(%rbp), %eax
movl %eax, -4(%rbp)
movq -12(%rbp), %rax
movl -4(%rbp), %ecx
movq %rcx, %rdx
popq %rbp
ret
.LFE0:
.size get, .-get
.ident "GCC: (Debian 8.3.0-6) 8.3.0"
.section .note.GNU-stack,"",@progbits
Оптимизация не используется. Возникает вопрос, почему -36(%rbp)
используется в качестве «ссылки» первого члена, когда они расположены последовательно в
.a == -24(%rbp)
.b == -20(%rbp)
.c == -16(%rbp)
Нет необходимости выделять -36(%rbp)
, который здесь использует компилятор. Это намеренно (поскольку комната или компилятор использует -36(%rbp)
как «ссылку» на первый член)?
Также, в конце,
movq -24(%rbp), %rax #take first member
movq %rax, -12(%rbp) #place it randomly
movl -16(%rbp), %eax #take third member
movl %eax, -4(%rbp) #place it randomly
Не имеет смысла, он не является последовательным с исходной структурой, а первый и третий член структуры случайным образом копируются в пространство функция get
была выделена.
Каковы соглашения для структур?