Переменная цикла основанного на области значений for цикл копируется с элементов области значений вместо того, чтобы быть сосланным, приводя к неэффективному коду
Этот дефект происходит когда переменная цикла основанного на области значений for цикл копируется с элементов области значений вместо того, чтобы читать элементы области значений ссылкой. Скопируйте элементы области значений только, когда его необходимое, потому что копирование их может привести к неэффективному коду. Этот дефект повышен, когда переменная цикла не модифицирована, и любое из этих условий верно:
Скопированная переменная цикла является большой тривиально copyable переменной типа. Копирование тривиально copyable объекта является более дорогим, чем ссылка на него, когда объект является большим.
Скопированная переменная цикла является нетривиально copyable типом. Копирование такой объектной силы требует внешнего вызова функции, который является более дорогим, чем ссылка на него. Чтобы проверять, copyable ли объект нетривиально, используйте функциональный std::is_trivially_copyable. Для получения дополнительной информации об этой функции, смотрите std::is_trivially_copyable в ссылке C++.
Основанный на области значений for циклы могут стать неэффективными, когда дорогая копия переменной цикла сделана в каждой итерации цикла. Рассмотрите этот код:
void foo( std::map<std::string, std::string> const& property_map )
{
for( std::pair< const std::string, std::string > const property: property_map)
{}
}Переменная цикла property объявляется как const вместо const&. В каждой итерации for цикл, std::pair объект копируется с карты property_maps к переменной цикла property. Из-за недостающего & в объявлении propert, дорогая операция копии сделана в каждой итерации вместо операции ссылки, приводящей к неэффективному коду. Поскольку этот код компилирует и функционирует правильно, неэффективный for циклы не могут быть замечены. Для подобного источника неэффективности смотрите Expensive pass by value и Expensive return by value.
Чтобы зафиксировать этот дефект, объявите переменную цикла основанного на области значений for цикл как const&. Рассмотрите этот код:
void foo( std::map<std::string, std::string> const& property_map )
{
for( std::pair< const std::string, std::string > const& property: property_map)
{}
}property объявляется как const&, ссылки на переменную различный элемент карты property_map в каждой итерации цикла, не копируя ресурса. Путем предотвращения дорогой копии в каждой итерации код становится более эффективным.| Группа: Производительность |
| Язык: C++ |
| Значение по умолчанию: Off |
Синтаксис командной строки:
EXPENSIVE_RANGE_BASED_FOR_LOOP_ITERATION |
| Удар: носитель |
Expensive pass by value | Expensive return by value | Find defects (-checkers)