2012-09-14 2 views
1

g ++가 포함 된 최신 cygwin을 실행하고 있습니다.최적화가 없으면 C 함수는 한 번만 호출됩니다.

컴파일러 플래그에 -O0이 포함되어 있어도 함수 호출이 최적화되고있는 것처럼 보입니다.

함수가 (모든 코드는 예를 들어 간단해진다)이 루프에서 호출된다

void my_func (void) 
{ 
    for (int i = 0; i < 2; i++) { 
     var1 = table[i]; 
     printf("i = %d\n", i); 
     function_to_call(); 
     printf("Called the function\n"); 
    } 
} 

가 호출하는 함수 등이다

void function_to_call() 
{ 
    int internal_var = var1; 
    // do some math using internal_var, passing the result 
    // as an input to another function 

    printf("var1: %d\n", internal_var); 
} 

이 실행 출력이 될 것이다 :

i = 0 
var1 = 0 
Called the function 
i = 1 
Called the function 

왜 이런 일이 발생합니까? function_to_call()을 루프를 통해 매번 호출해야합니다. 귀하의 예제 출력이 var1 = ... 동안 function_to_call()var1: ...를 출력으로

g++ -O0 -Wall -Wno-write-stings -Wextra 
+1

여기서 'var1'은 정의 되었습니까? –

+0

'function_to_call'에 반품 케이스가 있습니까? –

+7

최적화 프로그램이든 아니든 컴파일러는 해당 함수 호출을 생략 할 수 없습니다 (물론 printf 호출을 생략 할 수 없습니다). 일부 코드에 문제가 있다고 의심됩니다. – Mat

답변

1

첫째, 당신이 무엇을 게시, 사진의 "일부"입니다 : 여기에 표준 출력에서 ​​직접 촬영 컴파일러 출력에서 ​​발췌,이다. 그럼에도 불구하고, 나는 .... 문제에 자상을해야한다면

void function_to_call() 
{ 
    int internal_var = var1; 
    // do some math using internal_var, passing the result 
    // as an input to another function 

    printf("var1: %d\n", internal_var); 
} 
나는이 추측 할

"어떤 수학을 ..."조기 반환을 강요 섹션; 그러나 입력 (아마도 var1의 전역 변수로 전달됨)이 특정 값으로 설정된 경우에만 가능합니다.

0

당신은 내가 불완전한 코드 샘플을 게시 한 것이 틀림 없습니다. 이 함수에는 실제로 return 문이 없지만 범인을 발견했습니다. function_to_call()의 코드가 상태 시스템에 있습니다. 무슨 일이 있었는지는 코드가 완료되기 전에 상태가 변경되었으므로 다음 번에 다른 사례가 입력됩니다. 모두에게 사과하고 교훈을 얻었습니다. 당신의 노력에 감사드립니다.

+0

문제가 발견되어 반가워, 반갑습니다! – amdn

관련 문제