Переменная цикла основанного на области значений 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 local variable copy
| Expensive pass by value
| Expensive return by value
| Find defects (-checkers)