Производительность цикла для локальной переменной

Есть ли какие-либо штрафы за производительность для 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);
}

person Loom    schedule 11.11.2014    source источник
comment
Если предположить, что findStr и precessStr нетривиальны, это, скорее всего, не проблема. Сначала отметьте эталон, спросите позже.   -  person Borgleader    schedule 11.11.2014
comment
Также зависит от реализации конструктора, деструктора и оператора присваивания std :: string в вашей стандартной библиотеке C ++. Это ограничивает широкую применимость теста, который вы проводите в своей системе.   -  person pts    schedule 11.11.2014


Ответы (2)


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

person BeyelerStudios    schedule 11.11.2014

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

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

Объявление переменных внутри циклов, хорошая практика или плохая практика ?

person Federico Navarro    schedule 11.11.2014
comment
+1, безусловно, верно для POD, но если производительность когда-либо имеет значение (а иногда и имеет значение), то также рекомендуется выделять буферы вне тела цикла. - person BeyelerStudios; 11.11.2014