C_and_CPP 板


LINE

[修正] RVO 不会消除 copy-assignment [/修正]
1F:推 holymars:RVO是因为Compiler会把return value当成参数传进function 10/20 13:02
2F:→ holymars:里才会有的optimization吧..如果函式本身inline 10/20 13:03
3F:→ holymars:就不用把return value放在参数列上,自然也不会进行 10/20 13:03
4F:→ holymars:RVO啊.. 10/20 13:03
RVO 牵涉的不只是 implementation detail 它也会影响到语意 因为它是直接「消除」掉 copy-constructor 即使这个 copy-constructor 具有 side effect 也是一样会被省略 但 inline function 是不能影响语意的 compiler 不能因为 inline function 就自动省略该有的 constructor 除非说 copy-constructor 是 compiler 自己产生所以它知道内容 上面的例子比较不明显 我举 NRVO 来当例子 class Foo { public: Foo(const Foo& f) { puts("Foo::Foo()"); } Foo() {} Foo& operator=(const Foo& f) { puts("Foo::operator=()"); return *this; } }; inline Foo bar(const Foo& f) { Foo tmp = f; // copy constructor return tmp; } int main() { Foo a; Foo b = bar(a); return 0; } 如果依照你的说法 因为 inline function 的缘故 在宣告 b 的地方应该会展开成 Foo tmp = a; Foo b = tmp; 因此会产生两次 copy-constructor 呼叫 但实际上只会有一次 因为 NRVO 允许 compiler 直接把 tmp 代换成 b 而节省一次 copy-constructor 「即使」在这个情况中因为 inline function 的缘故 使得 b 的位址没办法当作参数传进 function 当中 但 compiler 知道上述的程式码是「inline function 展开後」的结果 还是有办法让 NRVO 起作用的 另一方面 在一般情况下 compiler 不可能会把两次的 copy-constructor 缩减成一次 因为它不知道你在 copy-constructor 中写了什麽东西 所以无法保证 Foo tmp = a; Foo b = tmp; 与 Foo b = a; 的结果是相同的 所以在这个 case 中 用 NRVO 来解释 compiler 消除掉 copy-constructor 的行为 才是最合理的 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.29.108
5F:→ Chikei:呃,inline的确不会有RVO,因为RVO消除的是obj A=func()中 10/21 01:46
6F:→ Chikei:obj A=(tmpObj B=func())的tmpObj B这个暂存物件,所以在 10/21 01:48
7F:→ Chikei:inline下不需要暂存returned value,自然也不用RVO,你所讲 10/21 01:49
8F:→ Chikei:修正,*消除的是拷贝returned value到tmpObj B这个动作 10/21 01:53
9F:→ Chikei:另外,copy assignment也不会被消除,根据ISO C++ 12.8.15 10/21 01:54
10F:→ Chikei:能省略的只有从tmpObj copy出来时的copy ctor跟func return 10/21 01:58
11F:→ Chikei:时,为了承接return值而用来产生tmpObj的copy ctor 10/21 01:59
12F:推 Chikei:上面那串讨论之所以=不会被invoke是因为obj A = B是直接呼 10/21 02:17
13F:→ Chikei:修正,*obj A = B等於obj A(B) (copy initialize)所以不会 10/21 02:18
14F:→ Chikei:动到operator= 10/21 02:19
15F:推 holymars:obj A = B; 和obj A(B)是不一样的 10/21 10:34
16F:→ holymars:前者是copy initialize,後者是direct initialize 10/21 10:35
17F:推 holymars:RVO也不是指省略掉tmpObj那件事 10/21 10:37
18F:→ holymars:12.8.15所允许的省略好像没什麽正式名称 就copy elison 10/21 10:38
19F:推 holymars:^^^^^^^修正一下 是12.8.15的第三个条件 10/21 10:53
※ 编辑: littleshan 来自: 140.112.29.108 (10/21 11:51)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:WOW站内搜寻

TOP