Параметр может быть дорогостоящим для копирования
Этот дефект возникает при передаче параметра по значению, а не по ссылке или указателю, но параметр не изменяется и либо:
Параметр является нетривиально копируемым типом. Дополнительные сведения о нетривиально копируемых типах см. в разделе 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*) для кода C или для ссылки const (const&) для кода C++.
Повышение производительности может зависеть от используемого компилятора, реализации библиотеки и среды.
| Группа: Производительность |
| Язык: C | C++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
EXPENSIVE_PASS_BY_VALUE |
| Воздействие: среднее |
Expensive copy in a range-based for loop iteration | Expensive local variable copy | Expensive return by value | Find defects (-checkers)