CompBook 板


C++ Object Model 答客问 (3) - NRV 最佳化 侯捷 [email protected] 2000.03.25 第一次发表於 清大.枫桥驿站(140.114.87.5).电脑书讯版(Computer/CompBook) 本文将於日後整理於 侯捷网站 侯捷网站:www.jjhou.com ---------------------------------------------------------------- leetron wrote (2000/02/11) : > 您好,关於深度探索C++物件模型一书,2.3节程式 > 转化语意学的部分,有个问题 > 想请教您。 > > 问题: > 在67页,最下面两行: > 这个程式的第一个版本不能实施NRV最佳化,因为test class > 缺少一个copy constructor。 > 但是在66页「在编译器层面做最佳化」那一段中所列的码显示, > 当编译器把xx以__result取代,变成__result.X::X(); > 即default constructor被唤起。唤起default constructor > 是可以理解的,可是编译器转换後的码并没有使用到 > copy constructor呀,为什麽67页最後两行却说缺少一个 > copy constructor,就不能实施这个最佳化了呢? > > 我对上面这个问题做了些解释,但不知我的猜想是否正确。 > > 我的解释是: > 如同63页与64页「回返值的初始化」这一段,编译器可能将 > 63页下面的 X bar()函式定义转换成64页的虚拟码,其中有 > 一行__result.X::X(xx); 这会使用到copy constructor。 > > 转换成64页的码後,65页与66页分述了两种後续可能出现的 > 最佳化动作,其中一种即是66页的编译器层面做最佳化。 > 如此,虽然66页最佳化後的码看起来并不使用到copy constructor, > 但是这些码是根据像64页那种样子的码(注一)最佳化而来的, > 而若没有copy constructor,根本无法转换成64页那种虚拟码, > 因为其中有一个呼叫copy constructor的动作。所以,虽然 > 66页经过编译器最佳化的结果省去了__result.X::X(xx); > 这个copy constructor的呼唤动作(因为根本没有xx了), > 但若没有明白提供一个copy constructor,却无法让编译器 > 进行这样的最佳化。 > > 另一方面,我参考第5章,205页最下面一段话: > 「一般而言如果你的设计之中,有许多函式都需要以传值(by value) > 传回一个local class object....那麽提供一个copy constructor > 就比较合理--甚至即使default memberwise语意已经足够。 > 它的出现会触发NRV最佳化。然而,就像我在前一个例子中 > 所展现的那样,NRV最佳化後将不再需要唤起copy constructor, > 因为运算结果已经被直接计算於「将被传回的object」体内了。」 > 所以,我提出如上所述那个解释,但不确定是否正确,所 > 以e-mail给您以确认一下。 > > 注一:当然,编译器到底怎麽实作这些转换动作,理论上 > 我们是未知的,不能一概而论。所以我写「像64页那种样子的码」。 侯捷回覆: 我最害怕的事情就是,读者写信来讨论《深度探索 C++ 物件模型》 一书内容。因为都是些高手提出些深奥的题目,而我必须把尘封的 记忆找出来… :) OK,作者(或译者)没有抱怨的权利 :)。我的回覆如下。 首先,我要说 leetron 把他的意思描述得非常清楚。在我收到 的读者来函中,算是上品 — 尤其是描述这麽复杂的思路。 其次,我同意 leetron 说: > 转换成64页的码後,65页与66页分述了两种後续可能出现的 > 最佳化动作,其中一种即是66页的编译器层面做最佳化。 但是我不同意 leetron 这样的看法: > 如此,虽然66页最佳化後的码看起来并不使用到copy constructor, > 但是这些码是根据像64页那种样子的码(注一)最佳化而来的, 我认为,NRV 最佳化并非是由 p63 的原始码而至 p64 的虚拟码, 再至 p66 的最佳化。我认为是从 p63 的原始码直接至 p66 的最佳化。 所以,似乎可以不需要 copy ctor。 但这麽一来我也无法解释为什麽 lippman 在 p67 最下强调 「必须要有 copy ctor 才能实施 NRV 最佳化」。 以下是其他读者的讨论,给您参考。 -- quote -- (引自 www.jjhou.com :书籍勘误/深度探索 C++ 物件模型) ★黄俊达先生认为:Lippman 在 p67 最後一行所言『这个程式的第一个版本 不能实施 NRV 最佳化,因为 test class 缺少一个 copy constructor』, 此语错误。黄先生认为如果程式没有 explicit copy constructor,编译器会 自动为我们做出来(如为 trivial,则直接 bitwise copy;如为 nontrivial, 则由编译器为我们合成出一个 copy constructor)。因此,有没有 explicit copy constructor 并不影响 NRV 最佳化的实施。他认为 NRV 最佳化主要是 由编译器 option 来决定要不要实施。他并且做了一些实验,判断 VC 和 gcc 都没有做到 NRV 最佳化,而其不做的理由不是因为技术上的困难,是为了 避免造成「user defined copy constructor 之副作用失效」-- 所谓副作用 是指,例如「在 user defined copy constructor 中做一个 cout 输出」之类 这种「与 memberwise copy 无关」的动作。 ★侯俊杰答覆:颇有道理。但请注意,Lippman 在 p.205 下方, p.221 上方等处,仍再三强调 copy constructor 对於 NRV 最佳化的导引之功,不知是否其间有什麽是我们没想到的? ★唐志青先生亦来信对於 NRV 提出与黄俊达先生相同的看法。感谢。 -- unquote -- -- the end  -- ※ Origin: 枫桥驿站<bbs.cs.nthu.edu.tw> ◆ Mail: [email protected]







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灯, 水草
伺服器连线错误,造成您的不便还请多多包涵!
「赞助商连结」





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灯, 水草

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

TOP