gpt4 book ai didi

C++ 在按值传递和按引用传递函数中赋值之间有区别吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:06 26 4
gpt4 key购买 nike

foo 和 bar 有区别吗:

class A
{
Object __o;

void foo(Object& o)
{
__o = o;
}

void bar(Object o)
{
__o = o;
}
}

据我理解,foo在调用时并没有对对象o进行拷贝操作,赋值时只进行了一次拷贝操作。 Bar 在调用时对对象 o 执行一次复制操作,并在赋值时执行另一次复制操作。所以我可以或多或少地说 foo 使用的内存比 bar 少 2 倍(如果 o 足够大)。对吗?

编译器是否可以优化 bar 函数以仅对 o 执行一次复制操作?即使 __o 指向参数 o 的本地拷贝而不是创建新拷贝?

最佳答案

这取决于。例如,如果编译器决定内联函数,显然不会有拷贝,因为没有函数调用。

如果你想确定,通过 const-reference 传递:

void bar(const Object& o)

这不会复制。请注意,您的非常量版本需要一个左值,因为引用是可变的。 foo(Object()) 不会工作,但临时对象(右值)可以绑定(bind)到常量引用。


顺便说一句,标识符中的双下划线是为编译器保留的。

关于C++ 在按值传递和按引用传递函数中赋值之间有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2493229/

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