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

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 не тривиальны, это, вероятно, не проблема. Сначала сравните, спросите позже.
  • 1
    Также зависит от реализации конструктора std :: string, деструктора и оператора присваивания в стандартной библиотеке C ++. Это ограничивает широкое применение теста, который вы делаете в вашей системе.
Теги:
performance
c++03
variable-initialization

2 ответа

1
Лучший ответ

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

2

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню