CppCoreGuidelines F.15 首选简单、常规的方式传递信息
24 April 2022
F.15: Prefer simple and conventional ways of passing information
理由
“不同寻常的奇技淫巧”会让其他程序员感到吃惊、难以理解、并且代码容易出 bug。如果确实觉得优化代码的时候需要不走寻常路,那么,请对其进行测试,看看是否能提升性能,并且要用文档和注释解释说明原因。
以下表格总结了F.16-21的建议。
常规传参方式:
复制成本低[1] | 移动成本低/适中[2] | 移动成本高[3] | |
---|---|---|---|
出参 | X f() |
X f() |
f(X&) |
出参/入参 | f(X&) |
f(X&) |
f(X&) |
入参 | f(X) |
f(const X&) |
f(const X&) |
入参,保留副本 | f(X) |
f(const X&) |
f(const X&) |
高级传参方式:
复制成本低[1] | 移动成本低/适中[2] | 移动成本高[3] | |
---|---|---|---|
出参 | X f() |
X f() |
f(X&) |
出参/入参 | f(X&) |
f(X&) |
f(X&) |
入参 | f(X) |
f(const X&) |
f(const X&) |
入参,保留副本 | f(X) |
f(const X&) + f(X&&) & move |
f(const X&) |
入参,移入 | f(X&&) |
f(X&&) |
f(X&&) |
其中:
- [1]
- 复制成本低
- 无法复制(如
int
,unique_ptr
)
- [2]
- 移动成本低(如
vector<T>
,string
) - 移动成本适中(如
array<vector>
,BigPOD
) - 未知(如:未知类型,模板)
- 移动成本低(如
- [3]
- 移动成本高(如
BigPOD[]
,array<BigPOD>
)
- 移动成本高(如
只有证明是必需的时候,才使用高级技巧,并添加文档或代码注释。
【注】&&
是 C++11 标准定义的新的引用操作符:右值引用 (rvalue
reference)。int&& a
表示 a
是一个右值( r-value )引用。一般用于声明函数的参数。简单来说:右值没有内存地址,如数字 6 或字符’v’。 int a
, a
是一个左值( l-value )。不过a+2
是一个右值。