В ответ на другой вопрос я хотел показать, что безумный уровень оптимизации gcc
( -O3
) в основном будет удалите все переменные, которые не использовались в main. Код был:
#include <stdio.h>
int main (void) {
char bing[71];
int x = 7;
bing[0] = 11;
return 0;
}
, а вывод 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
Теперь я вижу, что он удалил локальные переменные, но там все еще довольно много потерь. Мне кажется, что весь раздел:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret
можно было бы заменить на более простой:
xorl %eax, %eax
ret
Кто-нибудь знает, почему gcc
не выполняет эту оптимизацию? Я знаю, что это очень мало сэкономит для самого main
, но, если бы это было сделано и с обычными функциями, эффект излишней настройки указателя стека в массивном цикле был бы значительным.
Используемая команда для создания сборки было:
gcc -O3 -std=c99 -S qq.c