Re: [問題] 為什麼作業系統都用C寫? 而不用C++呢?

看板C_and_CPP作者 (我要加入劍道社!)時間16年前 (2009/03/06 14:22), 編輯推噓13(13023)
留言36則, 8人參與, 最新討論串7/37 (看更多)
關於 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

03/06 22:26, , 1F
你可以把這些文字導進 c++filt 它會幫你把 symbol 還原喔
03/06 22:26, 1F

03/06 22:26, , 2F
比方說 _Z3fooR4Test 會被轉回 foo(Test&)
03/06 22:26, 2F

03/06 22:28, , 3F
先推你的實驗精神!
03/06 22:28, 3F

03/06 22:29, , 4F
不過我還是想說, 原po想問的是問題應該是 target 在 kernel
03/06 22:29, 4F

03/06 22:30, , 5F
而不是 application ...
03/06 22:30, 5F

03/06 22:33, , 6F
那我要問你:哪裡不一樣?
03/06 22:33, 6F

03/06 22:34, , 7F
還是你的compiler比較厲害,可以分辨出來自己正在編kernel
03/06 22:34, 7F

03/06 22:34, , 8F
然後不施行這個最佳化?
03/06 22:34, 8F

03/06 22:37, , 9F
其實很多人被現有 OS 的「kernel mode programming」規則
03/06 22:37, 9F

03/06 22:38, , 10F
綁住觀念了,誤以為 kernel 實作造成的限制就是寫 kernel
03/06 22:38, 10F

03/06 22:38, , 11F
時也會遇上的限制。
03/06 22:38, 11F

03/06 22:41, , 12F
建議一開始的原 po 可以看看 UnixLite 的 source code。
03/06 22:41, 12F

03/06 22:43, , 13F
我用的 compiler 是 gcc, 有沒有比別人厲害我想大家都一樣
03/06 22:43, 13F

03/06 22:45, , 14F
推 tinlans 的建議, 希望原po可以看到 ^^
03/06 22:45, 14F

03/06 22:50, , 15F
嗯,很好,如果你的 comiler 沒不一樣,那我要問你
03/06 22:50, 15F

03/06 22:50, , 16F
請問編譯器的最佳化在 kernel 跟 ap 有什麼差異囉...
03/06 22:50, 16F

03/06 22:53, , 17F
沒有差異, 如果 option 都相同的話~
03/06 22:53, 17F

03/06 23:01, , 18F
那 C++ 寫的 OS 比較慢在哪裡 ( ._.)a
03/06 23:01, 18F

03/06 23:10, , 19F
先試試 tinlans 說的 UnixLite 如何?
03/06 23:10, 19F

03/06 23:13, , 20F
慢是你說的,我猜我直接「原作者」,就是你,比較清楚
03/06 23:13, 20F

03/06 23:14, , 21F
還是你其實不知道,只是隨便說說?
03/06 23:14, 21F

03/06 23:14, , 22F
呵呵 萬一我不是原作者 請問你想做什麼?
03/06 23:14, 22F

03/06 23:15, , 23F
我剛看了 UnixLite 的說明, 很可惜還沒抓到 source
03/06 23:15, 23F

03/06 23:15, , 24F
這串的第二篇是你吧?還是你被盜帳號…
03/06 23:15, 24F

03/06 23:15, , 25F
很多人講錯話以後都說是被盜帳號.. 我猜你不是那種人 :P
03/06 23:15, 25F

03/06 23:16, , 26F
第二篇是我, 我說的是問問題的第一篇才是原po
03/06 23:16, 26F

03/06 23:17, , 27F
我就是問你為什麼說速度慢, 不要再鑽了, 好無聊 XD
03/06 23:17, 27F

03/06 23:18, , 28F
該停了吧 再講下去大家也不會用C++寫的OS啊~~
03/06 23:18, 28F

03/06 23:18, , 29F
不好意思我喜歡直來直往,你就直接回答吧 XD
03/06 23:18, 29F

03/06 23:19, , 30F
為什麼?
03/06 23:19, 30F

03/06 23:48, , 31F
所以說程式語言真的是一種宗教...(亂入XD
03/06 23:48, 31F

03/06 23:51, , 32F
樓上...XD
03/06 23:51, 32F

03/07 00:00, , 33F
我是實用導向的,只要方便,VB我也用 XD
03/07 00:00, 33F

03/07 00:01, , 34F
不過要討論就是要講清楚…
03/07 00:01, 34F

03/07 00:31, , 35F
都不用吵,ASM效率最高啦~~(傳教)
03/07 00:31, 35F

03/07 01:47, , 36F
看來有人被戳破了說話就很閃躲..
03/07 01:47, 36F
文章代碼(AID): #19iJ72nY (C_and_CPP)
討論串 (同標題文章)
完整討論串 (本文為第 7 之 37 篇):
文章代碼(AID): #19iJ72nY (C_and_CPP)