C_and_CPP 板


LINE

關於 constructor 會不會產生額外負擔,我們來實驗看看吧。 class Test { public: Test() {} int i; }; int foo(Test& t); int bar() { Test t; return foo(t); // 避免 compiler 偷吃步 } 編出來的 assembly 有點長,所以我只取重要的部份。 首先是未開最佳化: _ZN4TestC1Ev: ; 這是 Test 的 constructor .LFB4: pushq %rbp .LCFI0: movq %rsp, %rbp .LCFI1: movq %rdi, -8(%rbp) leave ret ; 啥都不做就 return 了 _Z3barv: ; bar() .LFB5: pushq %rbp .LCFI2: movq %rsp, %rbp .LCFI3: subq $16, %rsp .LCFI4: leaq -16(%rbp), %rdi call _ZN4TestC1Ev ; 呼叫 Test 的 constructor leaq -16(%rbp), %rdi call _Z3fooR4Test ; 呼叫 foo() leave ret 所以未開最佳化的時候,constructor 的確有額外負擔。 那麼開最佳化後的結果呢? _Z3barv: ; bar() .LFB5: subq $24, %rsp .LCFI0: movq %rsp, %rdi call _Z3fooR4Test ; 呼叫 foo() addq $24, %rsp ret 產生出的 assembly 中並沒有 _ZN4TestC1Ev 這個 symbol 而且 bar() 只有呼叫 foo() 並沒有呼叫其它函式。 我另外又測試了 Test 繼承自其它 class 以及 Test 的成員 有其它 object 的情況,而結果也如預期。若一個 class 的 所有 parent class 的 default constructor 是空白,且 自己和所有的 member variable 的 default constructor 也 都是空白,那麼最佳化後,default constructor 並不會產生 任何額外負擔。 以上測試環境是 64bit Linux 使用 gcc 4.3.3。VC 我有點懶 得測,大家可以自己試試看。 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.121.115.112
1F:推 tinlans:你可以把這些文字導進 c++filt 它會幫你把 symbol 還原喔 03/06 22:26
2F:→ tinlans:比方說 _Z3fooR4Test 會被轉回 foo(Test&) 03/06 22:26
3F:推 yehsd:先推你的實驗精神! 03/06 22:28
4F:→ yehsd:不過我還是想說, 原po想問的是問題應該是 target 在 kernel 03/06 22:29
5F:→ yehsd:而不是 application ... 03/06 22:30
6F:推 yoco315:那我要問你:哪裡不一樣? 03/06 22:33
7F:→ yoco315:還是你的compiler比較厲害,可以分辨出來自己正在編kernel 03/06 22:34
8F:→ yoco315:然後不施行這個最佳化? 03/06 22:34
9F:→ tinlans:其實很多人被現有 OS 的「kernel mode programming」規則 03/06 22:37
10F:→ tinlans:綁住觀念了,誤以為 kernel 實作造成的限制就是寫 kernel 03/06 22:38
11F:→ tinlans:時也會遇上的限制。 03/06 22:38
12F:→ tinlans:建議一開始的原 po 可以看看 UnixLite 的 source code。 03/06 22:41
13F:推 yehsd:我用的 compiler 是 gcc, 有沒有比別人厲害我想大家都一樣 03/06 22:43
14F:→ yehsd:推 tinlans 的建議, 希望原po可以看到 ^^ 03/06 22:45
15F:推 yoco315:嗯,很好,如果你的 comiler 沒不一樣,那我要問你 03/06 22:50
16F:→ yoco315:請問編譯器的最佳化在 kernel 跟 ap 有什麼差異囉... 03/06 22:50
17F:→ yehsd:沒有差異, 如果 option 都相同的話~ 03/06 22:53
18F:推 yoco315:那 C++ 寫的 OS 比較慢在哪裡 ( ._.)a 03/06 23:01
19F:→ yehsd:先試試 tinlans 說的 UnixLite 如何? 03/06 23:10
20F:推 yoco315:慢是你說的,我猜我直接「原作者」,就是你,比較清楚 03/06 23:13
21F:→ yoco315:還是你其實不知道,只是隨便說說? 03/06 23:14
22F:→ yehsd:呵呵 萬一我不是原作者 請問你想做什麼? 03/06 23:14
23F:→ yehsd:我剛看了 UnixLite 的說明, 很可惜還沒抓到 source 03/06 23:15
24F:→ yoco315:這串的第二篇是你吧?還是你被盜帳號… 03/06 23:15
25F:→ yoco315:很多人講錯話以後都說是被盜帳號.. 我猜你不是那種人 :P 03/06 23:15
26F:→ yehsd:第二篇是我, 我說的是問問題的第一篇才是原po 03/06 23:16
27F:→ yoco315:我就是問你為什麼說速度慢, 不要再鑽了, 好無聊 XD 03/06 23:17
28F:推 Chevelle:該停了吧 再講下去大家也不會用C++寫的OS啊~~ 03/06 23:18
29F:推 yoco315:不好意思我喜歡直來直往,你就直接回答吧 XD 03/06 23:18
30F:→ yoco315:為什麼? 03/06 23:19
31F:→ akasan:所以說程式語言真的是一種宗教...(亂入XD 03/06 23:48
32F:推 Holocaust123:樓上...XD 03/06 23:51
33F:推 yoco315:我是實用導向的,只要方便,VB我也用 XD 03/07 00:00
34F:→ yoco315:不過要討論就是要講清楚… 03/07 00:01
35F:推 WolfLord:都不用吵,ASM效率最高啦~~(傳教) 03/07 00:31
36F:推 chph:看來有人被戳破了說話就很閃躲.. 03/07 01:47







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

請輸入看板名稱,例如:Gossiping站內搜尋

TOP