Параметр может быть дорогим, чтобы скопировать
Этот дефект происходит, когда вы передаете параметр значением вместо ссылкой или указателем, но параметр не модифицирован и также:
Параметр является нетривиально copyable типом. Для больше на нетривиально copyable типах, см. is_trivially_copyable.
Параметр является тривиально copyable типом, который является выше определенного размера. Например, объект, больше, чем 2 * sizeof(void *)
является более дорогим, чтобы передать значением, чем ссылкой или указателем.
Polyspace® отмечает немодифицированные параметры, которые удовлетворяют предыдущим условиям, даже если параметры не объявляются const
.
Polyspace не повышает дефекта если:
Переданным параметром, передаваемым по значению является тип только для перемещения. Например, std::unique_ptr
может быть перемещен - от, но не может быть скопирован.
Переданный параметром, передаваемым по значению изменяется.
Например, никакой дефект не повышен в этом коде где большой тривиально copyable 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 |
Удар: носитель |