Ker*_* SB 14
在某些情况下,您不需要修改输入,但仍需要输入的内部副本,然后您也可以按值获取参数.例如,假设您有一个返回向量的已排序副本的函数:
template <typename V> V sorted_copy_1(V const & v)
{
V v_copy = v;
std::sort(v_copy.begin(), v_copy.end());
return v;
}
Run Code Online (Sandbox Code Playgroud)
这很好,但如果用户有一个他们从不需要用于任何其他目的的向量,那么你必须在这里制作一个可能不必要的强制拷贝.所以只需按值进行参数:
template <typename V> V sorted_copy_2(V v)
{
std::sort(v.begin(), v.end());
return v;
}
Run Code Online (Sandbox Code Playgroud)
现在,生成,分类和返回矢量的整个过程可以基本上"就地"完成.
较便宜的示例是消耗计数器或迭代器的算法,这些算法需要在算法的过程中进行修改.再次,按值获取这些允许您直接使用函数参数,而不是需要本地副本.
像很多东西一样,这是一种平衡.
我们通过const引用来避免制作对象的副本.
当你传递一个const引用时,你传递一个指针(引用是带有额外糖的指针,使它们的味道更少苦).当然,假设对象很容易复制.
要访问引用,编译器必须取消引用指针以获取内容[假设它无法内联并且编译器优化了取消引用,但在这种情况下,它还将优化掉额外的副本,因此有也没有因价值而损失的情况.
因此,如果您的副本比解除引用和传递指针的总和"更便宜",那么当您通过值传递时,您将"获胜".
当然,如果你打算复制一个副本,那么你也可以在构造参数时制作副本,而不是稍后明确复制.
| 归档时间: |
|
| 查看次数: |
3627 次 |
| 最近记录: |