Оптимизация компилятора MS, которая заменяет переменные в функции? - PullRequest
3 голосов
/ 18 апреля 2009

Я не уверен, как объяснить поведение, которое я вижу, но здесь идет.

У меня есть функция foo, которая принимает три параметра: указатель, int и другой указатель. Когда я ломаю точку внутри foo, я ясно вижу, что все переменные - это те значения, которыми они должны быть. Однако, когда я опускаюсь ниже деклараций локальной переменной, один из параметров (int) внезапно меняется на ноль. Однако остальная часть функции выполняется так, как если бы она была исходным значением, поэтому все в порядке.

Это не происходит при полной отладке, но происходит при обычной отладке. Это какая-то оптимизация? Если да, то как это называется и где я могу получить подробности?

Пример:

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
  }
}

1 Ответ

6 голосов
/ 18 апреля 2009

Вы отлаживаете оптимизированный код. Локальным переменным нельзя доверять - компилятор может свободно использовать свое пространство, кэшировать их в регистре и т. Д.

Вероятно, вы видите, что B кэшируется в регистре, и его расположение в стеке используется повторно для какой-то другой переменной.

Аналогичный вопрос здесь: Могут ли оптимизации повлиять на возможность отладки приложения VC ++ с использованием его PDB?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...