2013-05-10 1 views
0

는, 단순히 코드의 다음 조각을 컴파일 :최적화 후 코드는 어떻게 작동합니까? 컴파일러 최적화를 공부하는 동안

#include<stdio.h> 
struct fraction { 
    int num ; 
    int denum ; 
}; 

int main() 
{ 
    struct fraction pi; 
    pi.num = 22; 
    pi.denum = 7; 
    return 0; 
} 

gcc test.c -o test 

나는이 분해

를 사용하여, 내가 얻을 :

push %ebp 
mov %esp,%ebp 
sub $0x10,%esp 
movl $0x16,-0x8(%ebp) 
movl $0x7,-0x4(%ebp) 
mov $0x0,%eax 
leave 
ret 

을하지만 최적화를 적용하는 경우 like :

gcc test.c -o test -O3 
,210

내가 분해 얻을 모든은 다음과 같습니다

push %ebp 
xor %eax,%eax 
mov %esp,%ebp 
pop %ebp 
ret 
최적화없이

값 (22)와 7 명확하게 볼 분해와 나는 분명히 코드가 어떻게 작동하는지 이해할 수 있지만, 그 값이 지금 후 최적화? 코드가 지금 어떻게 작동합니까? 제발 누군가 설명해주세요.

+0

코드는 본질적으로 아무 것도하지 않으며 컴파일러는이를 알고 있습니다. – Joe

+0

"denum"은 "denom"을 의미합니까? "함께"란 "없이"를 의미합니까? 나는 그것이 늦었다는 것을 알고 있지만, 컴파일러 최적화에 대해 이야기 할 때 세부 사항에 대한 관심은 다소 중요합니다 ... –

+1

프로그램이 아무 것도하지 않습니다. 최적화 프로그램이 그것을 알아내어 아무 것도하지 않는 프로그램으로 변경했습니다 (그러나 0을 반환합니다). – antlersoft

답변

12

단순히 는 완전히을 제거 코드를 효과적으로 예측할 수없는 부작용이있을 것입니다 외부에서 볼 수 아무것도하지 않기 때문에, 구조체의 생성이되고 이제 모든 코드는 main()에서 0을 반환 않습니다.

(컴파일러에게 누군가/다른 사람이 수정할 수 있기 때문에 실제로 구조체를 만들어야한다고 말하면 코드를 제거하지 않을 것입니다. 변수를 volatile으로 선언하면 알 수 있습니다. 어셈블러에서)

+0

또는 인쇄하거나 반환하십시오. 프로그램 외부에서 효과가 필요한 값으로 무언가를하십시오. –

4

컴파일러는 pi이 해당 범위 밖에서 사용되지 않았으며 부작용이 없었기 때문에 할당과 함께 전체 변수를 최적화했습니다.

결과 어셈블리 코드는 0eax에 거의로드하고 스택 포인터로 피팅 한 다음 반환합니다.