Параметр может быть дорогим, чтобы скопировать
Этот дефект происходит, когда вы передаете параметр значением вместо ссылкой или указателем, но параметр не модифицирован и также:
Параметр является нетривиально 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 |
| Удар: носитель |