- 主题:关于copy elision和move ctor
要触发nrvo, 返回值写在第一行, 然后return语句和返回值处于同一block.
如果代码有if动态分支,你在if里边返回的时候触发不了nrvo.
我感觉nrvo是一个编译期行为, 编译器如果无法预测你的分支,nrvo就不可能.
【 在 allegro (静水流深) 的大作中提到: 】
: I read again the NRVO carefully, seems I mis-understand the NRVO in case 5.
: NRVO needs to know which variable to return at construction.
: But still I have question for case-5, const effectively blocks the move ctor.
: ...................
--
FROM 120.244.224.*
我觉得这个nrvo可能要把返回值定义在栈入口处,这样退栈少退一点,才能免掉一次拷贝。可是要这么干必须让编译器在编译的时候就识别出那个对象是要返回的。
理论上来说,函数内部栈上对象拷出去是必须调用copy ctor的,我不认为还有什么其他方法实现rvo
【 在 here080 @ [CPlusPlus] 的大作中提到: 】
:
: 不对吧,这是很老的编译器行为吧。
: 【 在 hyperLee (老李) 的大作中提到: 】
: : 标 题: Re: 关于copy elision和move ctor
: : 发信站: 水木社区 (Sat Jul 18 08:29:51 2020), 站内
--
FROM 120.244.224.*
那我要是在对象的ctor里边干点与执行顺序相关的事,岂不是分分钟出错?
然而事实上这么做根本不会出错。这是得基本遵守的规则。
反正要触发nrvo,最好把返回对象定义在第一行,十分稳妥。
上面allego的代码,传参都是编译期常量,编译期一优化,分支就变得编译器可预测了。比如把true false改成键盘输入,if里边的nrvo我觉得是触发不了的。
【 在 here080 @ [CPlusPlus] 的大作中提到: 】
:
: 你代码写的顺序不一定是程序执行的顺序。
: 变量是否写在第一行根本就没关系。
: 只有很老的C编译器才会有这个。
: 【 在 hyperLee (老李) 的大作中提到: 】
--
FROM 120.244.224.*