2015-04-13 2 views
0

Я просто интересно, почему я хотел бы сделать это в C++Простой цикл по C++, почему

for(int i=0, n=something.size(); i<n; ++i) 

против

for(int i=0; i<something.size(); ++i)  

..

+1

Вы пропустили второй пример? –

+0

Что заставляет вас думать, что вы должны сделать первый блок кода вместо второго? Лично я бы выбрал второй блок. –

+0

как это неправильно введено –

ответ

5

Предполагая синтаксически правильные версии обоих образцов, если call to something.size() были дорогими, первый образец потенциально был бы более эффективным, потому что он экономит один вызов на каждую итерацию цикла. Тем не менее, вы должны оценить, действительно ли это имеет значение.

Обратите внимание, что два варианта имели бы другую семантику, если бы размер something должен был меняться внутри цикла.

+0

Я предполагаю, что если размер изменится, у вас также будет оригинальный размер, но это вопрос сомнительный. – chris

+0

Спасибо, что имеет смысл –

+0

@chris Да, мне было интересно, стоит ли упоминать об этом. – juanchopanza

2

Условие цикла оценивается до каждые цикл round, поэтому, если операнд сравнения не изменяется (т. Е. Вы не изменяете последовательность во время его итерации), то вам не нужно перекомпоновать операндом каждый раз и вместо этого вытащить его.

Независимо от того, зависит ли это от компилятора от вызова size(). Например, если он может доказать, что результат не может измениться во время итерации, то он может уже сделать подъем для вас. Если есть сомнения, скомпилируйте обе версии и сравните машинный код.

+0

Например, вы можете удерживать [эти] (http://goo.gl/2rUkE1) [two] (http://goo.gl/r2L9hu) версии рядом и сравнивать. –

+0

Я не вижу различий в примерах? Можете ли вы объяснить –

+0

@ user2079139: Точно :-) –

0

Если вы

for(int i=0; i<something.size(); ++i); 

это будет правильно. Вы должны проверить в руководстве по C++, как выглядит цикл. Ваш второй пример недействителен Код C++

+0

Его недействительный :) –

+0

@ user2079139 Недействительный. Вы просто не можете видеть его, несмотря на все подсказки ;-) – juanchopanza

+0

Ха-ха, я плохо вижу это Хуан :) –

0

Два примера не совпадают.

for(int i=0, n=something.size(); i<n; ++i) 
{ 
    // .... 
} 

оценивает something.size() только один раз.

for(int i=0; i<something.size(); ++i) // Syntax corrected 
{ 
    // .... 
} 

оценивает something.size() в каждом цикле.

Таким образом, они могут вести себя по-разному, если что-то изменить.

Если вы знаете, что something.size() не изменится, вы должны пойти на первое решение по причине производительности (т. Е. Только один вызов something.size()).

Если something.size() может измениться (например, в теле цикла for), второй вариант - путь.

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