- 主题:在容纳函数返回的对象时,const T& 和 T 有啥区别?
弱问,在以下代码里面:
const ReloadLog &rlog = reload();
和写成
ReloadLog rlog = reload();
有啥区别吗?用哪个形式比较好?
--
FROM 59.61.199.*
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:
: const ReloadLog &rlog = reload();
: 和写成
: ...................
如果rlog具有复杂构造的话,用第一个。在reload()里,要有可靠的内存分配。用毕需析构。
简单的int,long,用第二个。
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
有啥 C++ 的标准谈这个事吗?
我刚看了一下 godbolt, 如果不指定 -O 优化的话,前者会产生更多的指令其实。
【 在 ylh1969 的大作中提到: 】
: 如果rlog具有复杂构造的话,用第一个。在reload()里,要有可靠的内存分配。用毕需析构。
: 简单的int,long,用第二个。
--
FROM 59.61.199.*
【 在 hgoldfish 的大作中提到: 】
: 有啥 C++ 的标准谈这个事吗?
: 我刚看了一下 godbolt, 如果不指定 -O 优化的话,前者会产生更多的指令其实。
:
前者是指针的另一种表达方式,称为引用。函数返回指针,比返回一个复杂构造容易多了。
最古老的C,甚至不支持返回结构,只能返回结构指针。现在虽然可以了,但是我还是坚持不这么用。
庞大的结构,在传入函数和返回时,会占用大量栈空间。喜欢玩无栈协程的,就要避免用栈。
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
不是啊。我定义的函数是:
ReloadLog reload();
都是返回 ReloadLog 这个对象。
好像真没必要写成 const ReloadLog & 这种形式,完全没好处代码还长。
【 在 ylh1969 的大作中提到: 】
: 前者是指针的另一种表达方式,称为引用。函数返回指针,比返回一个复杂构造容易多了。
: 最古老的C,甚至不支持返回结构,只能返回结构指针。现在虽然可以了,但是我还是坚持不这么用。
: 庞大的结构,在传入函数和返回时,会占用大量栈空间。喜欢玩无栈协程的,就要避免用栈。
: ...................
--
FROM 59.61.199.*
反汇编代码看看。
我估计是new出来一个,然后填返回值。
第二个是直接填返回值。
【 在 hgoldfish 的大作中提到: 】
: 不是啊。我定义的函数是:
: ReloadLog reload();
: 都是返回 ReloadLog 这个对象。
: ...................
--
修改:ylh1969 FROM 221.218.61.*
FROM 221.218.61.*
理论上第二个会调用拷贝构造函数,深拷贝
作为返回值有时候会编译器优化什么的
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:
: const ReloadLog &rlog = reload();
: 和写成
: ...................
--
FROM 111.194.200.*
应该没啥区别
开优化以后都能避免额外的拷贝
不开的话应该下面那个可能会多一个拷贝构造
【 在 hgoldfish 的大作中提到: 】
: 标 题: 在容纳函数返回的对象时,const T& 和 T 有啥区别?
: 发信站: 水木社区 (Sat Feb 22 18:32:51 2025), 站内
:
: 弱问,在以下代码里面:
:
: const ReloadLog &rlog = reload();
:
: 和写成
:
: ReloadLog rlog = reload();
:
: 有啥区别吗?用哪个形式比较好?
:
: --
: 灭绝人性啊
:
:
: ※ 来源:·水木社区 mysmth.net·[FROM: 59.61.199.*]
--
FROM 117.129.54.*
有一种可能是:
reload 函数原型中的返回值是一个引用
需要考虑返回值的生命周期和安全性
【 在 hgoldfish 的大作中提到: 】
: 弱问,在以下代码里面:
: const ReloadLog &rlog = reload();
: 和写成
: ...................
--
FROM 120.253.228.*
多半是个return m_reloadLog;
return 临时变量的引用是非法操作
【 在 MyWorkLife 的大作中提到: 】
: 应该没啥区别
: 开优化以后都能避免额外的拷贝
: 不开的话应该下面那个可能会多一个拷贝构造
: ...................
--
FROM 111.194.200.*