Chciałem spojrzeć w jaki sposób niektóre C/C++ funkcje zostały przetłumaczone na montaż i stworzyłem następujący plik:Dlaczego gcc tworzy redundantny kod zespołu?
struct foo {
int x;
char y[0];
};
char *bar(struct foo *f)
{
return f->y;
}
I potem skompilował z gcc -S
(a także próbował z g++ -S
), ale kiedy spojrzał na Kod montaż, byłem rozczarowany aby znaleźć trywialny funkcji redundancji w barze, że myślałem gcc
powinien być w stanie zoptymalizować dala:
_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:
między innymi linie
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
wydają się niepotrzebnie zbędne. Czy istnieje jakikolwiek powód, dla którego gcc (i prawdopodobnie inne kompilatory) nie może/nie optymalizuje tego?
Uruchom gcc za pomocą przełącznika -O, aby włączyć standardowe optymalizacje. –
której wersji gcc używasz? –