2016-06-30 5 views
1

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

Допустим, у меня есть эта функция:

void foo(int value) { 
    int x = value * 1; 
    int y = value * 2; 
    int z = value * 3; 

    int u = x + 1; 
    int v = y + 2; 
    int w = z + 3; 
} 

Этот код является штраф, и его легко отлаживать (вы можете увидеть шаг за шагом, что происходит), но его использование большого объема памяти (28 байт, учитывая, что каждый int составляет 4 байта), и она может быть оптимизирована таким образом:

void foo(int value) { 
    int u = value * 1 + 1; 
    int v = value * 2 + 2; 
    int w = value * 3 + 3; 
} 

Исходя из этого у меня есть несколько вопросов:

  1. Создает ли компилятор такую ​​оптимизацию в выпусках ?.
  2. Повторно использует память переменных, которые больше не используются в функции, чтобы избежать использования большего количества регистров ?.
+1

Пример в реальном мире может быть лучше. Как и эти функции являются не-ops и, возможно, полностью оптимизированы. Не всегда можете проверить сгенерированную сборку, чтобы убедиться, что компилятор действительно делает после компиляции кода. – NathanOliver

+1

Как только функция возвращается, эти 28 байтов освобождаются для следующего вызова функции. Они просто временно хранятся в стеке (что также довольно дешево для «выделения»). – Steve

+1

Скорее всего, ни один из них не будет существовать, поскольку выполнение функции не зависит от их существования. Кроме того, распределение регистров - это вещь. Большинство локальных переменных не находятся в памяти. – harold

ответ

3

Да. Современный компилятор удалит эти промежуточные переменные. Да. Современный компилятор будет складывать константы и повторно использовать регистры и ячейки памяти.

Вкратце; не беспокойтесь о материалах на этом уровне, компилятор исправит это. Вместо этого беспокойтесь о написании читаемого кода и алгоритмических улучшений и оставьте детали компилятору - в наши дни это довольно умно;)

Смежные вопросы