Переменные, объявленные внутри цикла - PullRequest
20 голосов
/ 05 января 2012

Если бы я объявил переменную внутри цикла, было бы быстрее получить объявление вне цикла? Перераспределяет ли программа память для 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);
}

Ответы [ 3 ]

14 голосов
/ 05 января 2012

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

13 голосов
/ 05 января 2012

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

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

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

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

1 голос
/ 05 января 2012

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

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