2009-04-18 7 views
3

내가 보는 행동을 설명하는 방법을 모르겠지만 여기에 있습니다.함수의 변수를 대체하는 MS 컴파일러 최적화?

필자에게는 포인터, int 및 다른 포인터의 세 가지 매개 변수를 사용하는 foo라는 함수가 있습니다. 내가 foo 내부를 깰 때, 나는 분명히 모든 변수가 있어야한다는 것을 알 수 있습니다. 그러나 로컬 변수 선언을 넘어서면 매개 변수 중 하나 (int)가 갑자기 0으로 변경됩니다. 그러나 나머지 함수는 원래 값인 것처럼 실행되므로 모두 잘 수행됩니다.

전체 디버그에서는 발생하지 않지만 일반적인 디버그에서는 발생합니다. 이것은 어떤 종류의 최적화입니까? 그렇다면 무엇이 불려지 며 세부 사항을 어디서 구할 수 있습니까?

예 : 최적화 된 코드를 디버깅하고

void foo(void *A, int B, void *C) 
{ 
    // B == 5 
    int X = 3; 
    char *Y = getSomeStaticString(); 
    // ... some other variable declarations like the above 

    // B, according to the debugger, is now 0 
    if (B == 5) { 
    // But this still executes 
    } 
} 

답변

6

. 지역 변수는 신뢰할 수 없습니다. 컴파일러는 자유롭게 공간을 재사용하고 레지스터에 캐시하는 등의 작업을 할 수 있습니다.

B가 레지스터에 캐시되어 스택 위치가 다른 변수에 대해 재사용되고 있습니다.

여기에서 비슷한 질문 : Can optimizations affect the ability to debug a VC++ app using its PDB?

+0

그게 전부 였어! 감사 – Sydius

관련 문제