- 主题:在容纳函数返回的对象时,const T& 和 T 有啥区别?
弱问,在以下代码里面:
const ReloadLog &rlog = reload();
和写成
ReloadLog rlog = reload();
有啥区别吗?用哪个形式比较好?
--
FROM 59.61.199.*
有啥 C++ 的标准谈这个事吗?
我刚看了一下 godbolt, 如果不指定 -O 优化的话,前者会产生更多的指令其实。
【 在 ylh1969 的大作中提到: 】
: 如果rlog具有复杂构造的话,用第一个。在reload()里,要有可靠的内存分配。用毕需析构。
: 简单的int,long,用第二个。
--
FROM 59.61.199.*
不是啊。我定义的函数是:
ReloadLog reload();
都是返回 ReloadLog 这个对象。
好像真没必要写成 const ReloadLog & 这种形式,完全没好处代码还长。
【 在 ylh1969 的大作中提到: 】
: 前者是指针的另一种表达方式,称为引用。函数返回指针,比返回一个复杂构造容易多了。
: 最古老的C,甚至不支持返回结构,只能返回结构指针。现在虽然可以了,但是我还是坚持不这么用。
: 庞大的结构,在传入函数和返回时,会占用大量栈空间。喜欢玩无栈协程的,就要避免用栈。
: ...................
--
FROM 59.61.199.*
嗯。上面写的就是返回个临时变量。开 godbolt 看,使用`ReloadLog rlog =`这个写法,编译器都会直接优化成这个临时变量的引用。不会有其它的操作。等效代码是:
ReloadLog *rlog = alloca(sizeof(ReloadLog));
reload(rlog);
void reload(RelogLog *rlog) {
*(new(rlog) ReloadLog()) = ...; // return
}
是否可以说,c++ 的返回值,其实都是 c++ 函数的一个隐式参数?
【 在 z16166 的大作中提到: 】
: chatgpt 一般建议:
: 如果 reload() 返回的是 const ReloadLog &,优先用 const ReloadLog &rlog = reload();
: 如果 reload() 返回的是 ReloadLog(临时对象),用 ReloadLog rlog = reload(); 可能更安全,避免悬垂。
: ...................
--
修改:hgoldfish FROM 59.61.199.*
FROM 59.61.199.*
我的意思是准备好内存地址。。
【 在 z16166 的大作中提到: 】
: 幻觉吧?哈哈
: 参数要在进入函数前准备好。作为返回值的变量没这个要求
--
FROM 59.61.199.*
这不是这个问题。
我这里 reload() 返回的是值。前面没写清楚。这个是定义:
ReloadLog reload();
我主要是想问,调用者应该使用 const ReloadLog & 还是使用 ReloadLog 来承载返回值。
目前我是养成了习惯,都用 const ReloadLog & 好像在大多数情况下是可行的。但是编译器未优化编译的话,const ReloadLog & 的效率其实比较低。优化之后则没有区别。
【 在 wanllow 的大作中提到: 】
: 这个问题在C++ Primer 6.3.2中有比较详细的论述
: 总之:不要返回局部变量的指针或引用,否则会报错
: 如果要返回的值属于很大的数据结构,使用引用返回比值返回更效率
: ...................
--
修改:hgoldfish FROM 121.207.149.*
FROM 121.207.149.*