按值传递与按右值引用传递
函数参数的选择按值传递还是按右值引用传递取决于几个因素。
按值传递
-
(Widget w)
- 创建以下内容的副本输入参数,保持原始不变。
- 涉及隐式复制操作,这对于大型或复杂对象可能效率低下。
- 假定参数的所有权,即使它不修改它.
通过右值引用
-
(Widget&& w)
- 用右值(例如,过期的临时对象)强制初始化参数,防止复制操作。
- 当调用者需要副本时,需要使用 std::move 显式声明副本.
- 禁止在调用者的副本中反映返回值的任何更改。
主要差异
-
复制所有权:按值传递要求必须复制参数,而按右值引用传递允许函数移动参数,从而在某些情况下消除额外的移动构造函数调用。
-
接口语义:右值引用表明该函数打算获取该值的所有权,并且不对其持续存在负责。
-
效率:通过右值传递在调用者不需要输入对象副本的情况下,引用可以更有效。
选择正确的方法
在以下情况下使用按值传递:
- 该函数需要输入对象的副本或修改版本。
- 输入对象很小或复制成本较低。
使用 pass在以下情况下通过右值引用:
- 函数需要获取所有权并修改输入对象。
- 输入对象很大或复制成本很高。
- 调用者不需要输入对象的副本。
以上是在 C 中何时选择按值传递与按右值引用传递?的详细内容。更多信息请关注PHP中文网其他相关文章!