2014-11-11 2 views
0

Есть ли какие-либо штрафы за производительность 1-го образца против 2-го и почему?Производительность петли для локальной переменной

// 1. variable is declared inside the loop body 
while(isSomethingTrue == true) { 
    std::string str; 
    findStr(str); // str initialization 
    processStr(str); // processStr does not change its argument 
} 

// 2. variable is declared outside the loop body 
std::string str; 
while(isSomethingTrue == true) { 
    findStr(str); 
    processStr(str); 
} 
+2

Предполагая, что '' findStr' и precessStr' не являются тривиальными, это, вероятно, будет не проблема. Сначала проверьте тест, спросите позже. – Borgleader

+1

Также зависит от конструктора std :: string, destructor и оператора присваивания в стандартной библиотеке C++. Это ограничивает широкую применимость теста, который вы выполняете в своей системе. – pts

ответ

1

В целом будет накладные расходы запуска конструктора/Разрушитель вашего объекта на итерации цикла, если это не просто старые данные. В случае строки: выделение и освобождение внутреннего буфера str. Это влияет только на производительность, если findStr и processStr также очень эффективны.

2

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

Вот еще один пост с более подробной информацией о том, что:

Declaring variables inside loops, good practice or bad practice?

+0

+1, безусловно, верно для POD, но если производительность всегда имеет значение (и иногда это происходит), то также хорошей практикой является выделение буферов вне тел цикла – BeyelerStudios

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