【发布时间】:2014-03-03 05:20:51
【问题描述】:
我需要将非 POD 类型传递给 C++ 函数。 我想修改该函数内部的值,但我不希望该更改在该函数之外可见。
我的第一个选择是按值传递,这会创建一个副本。
void myFunction (NonSimpleObject foo) {
foo = ~foo;
}
我也可以通过引用传递,这在函数调用过程中速度更快,但我需要在内部创建一个副本以不影响外部值;
void myFunction (NonSimpleObject &foo) {
NonSimpleObject foo_internal = ~foo;
}
为了向调用者发出我不会修改外部值的信号,我想包含一个 const 限定符。这在按值调用时当然是隐含的,但我想更详细一点。但是传递一个 const 值将迫使我在内部创建第二个副本来修改该值,这也与 const 限定符最初的用途相反。
void myFunction (const NonSimpleObject foo) {
NonSimpleObject foo_internal = ~foo;
}
传递一个 const 引用既会向调用者发出信号,表明外部值没有改变,并且只需要在函数内部复制一份。
void myFunction (const NonSimpleObject &foo) {
NonSimpleObject foo_internal = ~foo;
}
哪一个最适合我的目的(良好的性能,对调用者来说很冗长),优点/缺点是什么?
这也归结为以下问题:在函数内部进行复制而不是在参数传递期间进行复制是否有任何优势,反之亦然?
【问题讨论】:
-
传递(非常量)值似乎是最干净的方法,我认为没有缺点(如果您决定函数根本不需要副本,则重新编译除外)。
-
按值传递,并在堆栈副本上进行更改,这些将在您的函数之外不可见。
-
To signal to the caller that I will not modify the outside value, I would like to include a const qualifier. This is of course implicit when calling by value, but I would like to be more verbose这太傻了,原因你在下一行找到。
标签: c++ constants pass-by-reference pass-by-value