Переменные, объявленные внутри цикла

Если бы я должен был объявить переменную внутри цикла, быстрее ли это объявление за пределами цикла? Перераспределяет ли программа память на n на каждой итерации или использует одну и ту же ячейку памяти?

for(int i=0;i<10;i++)
{
    int n = getNumber();
    printf("%d\n",n);
}

против

int n;
for(int i=0;i<10;i++)
{
    n = getNumber();
    printf("%d\n",n);
}

Ответы

Ответ 1

Переменные не действительно "созданы" или "уничтожены". Это понятия на уровне абстракции языка программирования. У компилятора не требуется сопоставление между одним и несколькими адресами памяти и памятью. На практике большую часть времени пространство стека для локальных переменных выделяется сразу в начале функции, поэтому это не повлияет на производительность.

Обратите внимание, что С++, в отличие от C, который не имеет понятия для конструкторов, поддерживает построение и разрушение объектов, поэтому, если вы должны были определить переменную типа класса в цикле for, как показано ниже,

class MyClass { 
    public: MyClass() { cout << "hello world" << endl; }
};
//...
for (int i = 0; i < 10; ++i) {
   MyClass m;
} 

вы каждый раз называете его конструктором, эффективно печатая "мир привет" десять раз. Это очень отличается от объявлений C и не следует путать с ним.

Ответ 2

Любой современный компилятор оптимизирует их для одного и того же машинного кода, поэтому вы не увидите различий.

Ответ 3

Для большинства современных компиляторов это не имеет значения. Они будут назначать регистры процессора или размещать переменные в стеке максимально эффективно.