Como parte de responder a otra pregunta, quería mostrar que el nivel insano de optimización de gcc
(-O3
) básicamente eliminaría cualquier variable que no se usara en main. El código fue:¿El nivel de optimización de locura gcc (-O3) no es lo suficientemente insano?
#include <stdio.h>
int main (void) {
char bing[71];
int x = 7;
bing[0] = 11;
return 0;
}
y la salida fue gcc -O3
:
.file "qq.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits
Ahora puede ver que es eliminado las variables locales, pero todavía hay un poco de desperdicio en ese país. Me parece que todo el:
secciónpushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret
podría ser sustituido por el más simple:
xorl %eax, %eax
ret
¿Alguien tiene alguna idea de por qué gcc
no lleva a cabo esta optimización? Sé que ahorraría muy poco para main
, pero si esto también se hiciera con funciones normales, el efecto de ajustar innecesariamente el puntero de la pila en un ciclo masivo sería considerable.
El comando utilizado para generar la Asamblea fue:
gcc -O3 -std=c99 -S qq.c
¿Se puede incluir el comando completo invocando gcc? –