gpt4 book ai didi

c++ - 按值、常量值、引用或常量引用传递非 POD 类型

转载 作者:太空狗 更新时间:2023-10-29 19:40:30 25 4
gpt4 key购买 nike

我需要将非 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;
}

哪个最适合我的目的(性能好,对调用者来说冗长),优点/缺点是什么?

这也归结为以下问题:在函数内部复制而不是在参数传递期间进行复制是否有任何优势,反之亦然?

最佳答案

如果您需要一个本地对象,那么按值传递是最好的。如果参数是临时的或显式移动的,这将启用移动语义,从而可以避免不必要的复制。

无论是否需要,按引用传递都会强制复制一份。如果引用不是 const,则参数不能是临时的。按值接受 const 对象然后复制它是很奇怪的。

(请注意,在您的特定示例中,您不需要本地拷贝,只需要将运算符应用于参数的结果;因此 const 引用可能更合适。)

关于c++ - 按值、常量值、引用或常量引用传递非 POD 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21599930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com