复制成本高的参数不应按值传递
8.7 ID_paramPassedByValue
如果参数为基本类型,或只包含少量非静态数据成员,且通过简单赋值即可完成复制,可以通过值传递参数,否则应使用引用或指针的方式以避免额外的复制开销。
一般而言,如果参数的大小超过了两个指针,不应使用值传递的方式。
示例:
using S = std::string;
void foo(S s) { // Non-compliant
....
}
例中 s 是按值传递的参数,由传入的实际参数复制而成,涉及内存分配和非常量时间复杂度的数据复制,成本较高。
应改为常量引用的方式:
void foo(const S& s) { // Compliant
....
}
当参数为复制成本较高的常量对象时,往往是漏写了引用符号,为常见笔误,如:
void bar(const S s); // Non-compliant, missing ‘&’
当参数在函数体内被修改,也可能是有意让形式参数作为实际参数的副本,这种情况可不受本规则约束,但也可能是漏写了引用符号,审计工具不妨根据配置给出提醒,如:
S lower(S s) { // Let it go?
transform(
s.begin(), s.end(), s.begin(),
[](unsigned char c) { return static_cast<char>(tolower(c)); }
);
return s;
}
配置
allowModifiedParam: 是否放过被修改的参数
maxParamSize: 允许按值传递的参数对象大小上限