2011-02-23 4 views
9

또 다른 질문에 답하기 위해 gcc (-O3)의 최적화 수준이 기본적으로 주에서 사용되지 않은 변수를 제거한다는 것을 보여 드리고자합니다. 코드는했다 :gcc 미친 최적화 수준 (-O3)이 충분히 미치지 않습니까?

#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 
+0

gcc를 호출하는 전체 명령을 포함 할 수 있습니까? –

답변

9

해당 최적화는 컴파일러 플래그를 사용하여 활성화 할 수 있습니다. 이렇게하면 일부 컴퓨터에서는 디버깅이 불가능 해지고 다른 모든 컴퓨터에서는 디버깅이 어려워 지므로 대개 비활성화됩니다.

귀하의 GCC 문서에 따르면 다양한 최적화 수준에서 이 활성화되었다고하더라도, 그럴 가능성은 거의 없습니다. 거의 확실하게 명시 적으로 활성화해야합니다.

6

는 별도의 스택 조작을 제거해야 -fomit-frame-pointer (source) 켜기.

GCC는 디버깅을 쉽게 수행 할 수 있기 때문에 (디버깅이 필요할 때 스택 추적을 얻음) 의사 결정자가 이 GCC 4.6부터 시작한다는 것을 알지만