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

請輸入看板名稱,例如:e-shopping站內搜尋

TOP