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