Я хотел посмотреть, как определенные функции C/C++ были преобразованы в ассемблер, и я создал следующий файл:
struct foo {
int x;
char y[0];
};
char *bar(struct foo *f)
{
return f->y;
}
Затем я скомпилировал его с помощью gcc -S
(а также попробовал с g++ -S
), но когда я посмотрел на ассемблерный код, я был разочарован, обнаружив тривиальную избыточность в функции bar, которую, как я думал, gcc
можно оптимизировать:
_bar:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movabsq $4, %rcx
addq %rcx, %rax
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
popq %rbp
ret
Leh_func_end1:
Среди прочего вещи, строки
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
кажутся бессмысленно излишними. Есть ли какая-то причина, по которой gcc (и, возможно, другие компиляторы) не может/не оптимизирует это?