Когда я делаю функцию большую часть времени, я делаю много переменных внутри нее, просто потому, что ее легче отлаживать код.Оптимизация компилятора - использование переменной памяти
Допустим, у меня есть эта функция:
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;
}
Исходя из этого у меня есть несколько вопросов:
- Создает ли компилятор такую оптимизацию в выпусках ?.
- Повторно использует память переменных, которые больше не используются в функции, чтобы избежать использования большего количества регистров ?.
Пример в реальном мире может быть лучше. Как и эти функции являются не-ops и, возможно, полностью оптимизированы. Не всегда можете проверить сгенерированную сборку, чтобы убедиться, что компилятор действительно делает после компиляции кода. – NathanOliver
Как только функция возвращается, эти 28 байтов освобождаются для следующего вызова функции. Они просто временно хранятся в стеке (что также довольно дешево для «выделения»). – Steve
Скорее всего, ни один из них не будет существовать, поскольку выполнение функции не зависит от их существования. Кроме того, распределение регистров - это вещь. Большинство локальных переменных не находятся в памяти. – harold