2012-01-04 4 views
16

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

ответ

12

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

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

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

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

+0

Спасибо, я имел в виду, что память перераспределяется на каждой итерации. Я изменил вопрос. –

14

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

+2

Определение в цикле более четкое и может привести к созданию более оптимизированного кода, поскольку компилятор знает время жизни (хотя, вероятно, не для простого типа) –

1

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

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