Возможно, параметр дорого копируется
Этот дефект возникает, когда вы передаете параметр по значению вместо по ссылке или указателю, но параметр не изменен и либо:
Параметр является нетривиально копируемым типом. Для получения дополнительной информации о нетривиально копируемых типах см. is_trivially_copyable.
Параметр является тривиально копируемым типом, который выше определенного размера. Для примера - объект, больше 2 * sizeof(void *)
является более дорогим для прохождения по значению, чем по ссылке или указателю.
Polyspace® флаги немодифицированные параметры, которые удовлетворяют предыдущим условиям, даже если параметры не объявлены const
.
Polyspace не поднимает дефект, если:
Переданный значением параметр является типом только для переноса. Для образца, std::unique_ptr
может быть перемещен - из, но не может быть скопирован.
Переданный параметром значение изменяется.
Для примера в этом коде не возникает никакого дефекта, где большой тривиально копируемый Buffer
и unique_ptr
только для переноса передаются значением.
#include<memory> typedef struct Buffer { unsigned char bytes[ 20 ]; } Buffer; void func1(Buffer modified_param) { ++modified_param.bytes[ 0 ]; } void func2(std::unique_ptr<Buffer> move_only_param);
Передача параметра по значению создает копию параметра, которая неэффективна, если параметр дорог для копирования. Даже если ваше намерение - пройти по ссылке или указателю, вы можете забыть const&
или const*
в сигнатуре функции и непреднамеренно запустите неэффективную версию функции.
Преобразуйте параметр в const (const*
) для кода С или к ссылке const (const&
) для кода С++.
Эффективность улучшения могут варьироваться в зависимости от используемого компилятора, реализации библиотеки и окружения.
Группа: Эффективность |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки
: EXPENSIVE_PASS_BY_VALUE |
Влияние: Средний |
Expensive copy in a range-based for loop iteration
| Expensive local variable copy
| Expensive return by value
| Find defects (-checkers)