2011-02-23 14 views
9

Başka bir soruya cevap vermenin bir parçası olarak, gcc (-O3) 'un çılgınlık seviyesinin temelde kullanılmayan herhangi bir değişkeni ortaya çıkardığını göstermek istedim. kodu:gcc insani optimizasyon seviyesi (-O3) yeterince deli değil mi?

#include <stdio.h> 
int main (void) { 
    char bing[71]; 
    int x = 7; 
    bing[0] = 11; 
    return 0; 
} 

ve gcc -O3 çıkış oldu:

.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 

Şimdi yerel değişkenler kaldırılır ama fire biraz hala orada olduğu görülüyor.

pushl %ebp 
    xorl %eax, %eax 
    movl %esp, %ebp 
    popl %ebp 
    ret 

bölüm ile değiştirilmesi mümkündür basit: tüm geliyor bana

xorl %eax, %eax 
    ret 

kimse gcc Bu optimizasyonu yapmaz neden bir fikri var mı? Bunun, main için çok az tasarruf edeceğini biliyorum, ancak eğer bu normal fonksiyonlarla da yapılmışsa, yığın işaretçisini gereksiz bir döngüde gereksiz yere ayarlama etkisi kayda değer olacaktır.

takımını oluşturmak için kullanılan komut

oldu:

gcc -O3 -std=c99 -S qq.c 
+0

gcc'i çağırmak için komutun tamamını ekleyebilir misiniz? –

cevap

9

Bu özel optimizasyonu derleyici bayrağından etkinleştirebilirsiniz. Bunu yapmak, bazı makinelerde hata ayıklamayı imkansız kılar ve her şeyde daha da zorlaşır, bu yüzden genellikle devre dışıdır.

GCC belgeleriniz, çeşitli en iyileştirme düzeylerinde etkin olduğunu söylese de, büyük olasılıkla bunu kesinlikle kendinizin açıkça etkinleştirmeniz gerektiği anlamına gelmez.

6

ekstra yığın manipülasyonlara kurtulmak gerektiğini (source) açılması.

GCC, görünürde hata ayıklamayı kolaylaştırdığı için (bkz. Gerektiğinde yığın izlemesi), GCC, görünüşe göre, GCC 4.6 ile varsayılan başlangıç ​​olduğuna dikkat edin.