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

看板C_and_CPP (C/C++)作者 (我要加入劍道社!)時間16年前 (2009/03/08 12:33), 編輯推噓3(308)
留言11則, 5人參與, 最新討論串26/37 (看更多)
※ 引述《tinlans ( )》之銘言: : 顯然用 C++ 的 OO 機制是會比 C 的 OO 慢一點 : ( : 其實是因為我 C 的部分沒有實作出 OO 特性, : 它是 static 語意 (要拔掉 union 然後用 void * 代替資料欄位), : 完全模擬 OO 的話那 0.2 秒的差異馬上會不見, : 有人想戰的話我再做細部實作 XD : ) 先不討論它的 static 語意,在我看來把 function pointer 直接放 在 struct 中有太占空間的缺點,每增加一項操作,物件所占的空間 也會一起增加。 因此我把它改成使用 vtable 的版本: poly.c: struct Vtable; struct Data { struct Vtable* vptr; enum Type type; union Mixed mixed_data; }; struct Vtable { void (*changeValue)(struct Data *); int (*toInt)(struct Data *); }; client.c: int main(){ ... while(i--) (*data->vptr->changeValue)(data); ... } 有趣的是,這樣改過以後,C 的版本依然比 C++ 快了一點。為了瞭 解它快在哪裡,我編出了 assembly 並檢視核心的迴圈部份: C C++ .L2: │ .L4: movq (%rbp), %rax │ movq (%rbp), %rax addl $1, %ebx │ addl $1, %ebx movq %rbp, %rdi │ movq %rbp, %rdi call *(%rax) │ call *(%rax) cmpl $500000000, %ebx │ .LEHB2: jne .L2 │ cmpl $500000000, %ebx │ jne .L4 兩邊根本是一樣的:this 放在 rbp 中,並取出 function pointer 放在 rax 內。那麼關鍵的 function 內容呢? double_change_value: │ _ZN6Double11changeValueEv: .LFB37: │ .LFB41: movsd .LC0(%rip), %xmm0 │ movsd .LC0(%rip), %xmm0 addsd 16(%rdi), %xmm0 │ addsd 8(%rdi), %xmm0 movsd %xmm0, 16(%rdi) │ movsd %xmm0, 8(%rdi) ret │ ret 唯一的差別是 16(%rdi) 與 8(%rdi),因為 member 在物件中的位置 不一樣。我有想過也許是 alignment 的問題,因此多塞了一個變數進 class 中,使得兩邊的 assembly 完全相同。但測出來的時間並沒有 任何改變。 這麼一來我就很不解了,速度到底是差在哪? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.120.91

03/08 12:48, , 1F
這一串討論越來越沒意義了...
03/08 12:48, 1F

03/08 12:52, , 2F
要不要測一下 alignment 32 XD 或者 64 如果有支援的話
03/08 12:52, 2F

03/08 12:53, , 3F
同樣 CODE 不同效能的問題 我是查到記憶體位置問題啦
03/08 12:53, 3F

03/08 13:48, , 4F
誰寄信給Bjarne Stroustrup請他開釋一下
03/08 13:48, 4F

03/08 13:50, , 5F
不過我想強調的重點是,幾乎不會有人在 kernel 用 C 寫出
03/08 13:50, 5F

03/08 13:51, , 6F
這樣的東西,反倒是第一種 c + switch case + union 的居
03/08 13:51, 6F

03/08 13:51, , 7F
多,但是那種寫法通常比 C++ 用 vtable 跳還慢 XD
03/08 13:51, 7F

03/08 13:55, , 8F
你真的想量迴圈速度的話可能要用 getrusage() 抓比較準,
03/08 13:55, 8F

03/08 13:56, , 9F
因為 C++ 進入 main 前做的事情跟 C 不一樣。
03/08 13:56, 9F

03/08 14:26, , 10F
anyway, 新版: http://tinyurl.com/cmpr8k XD
03/08 14:26, 10F

03/08 14:28, , 11F
很有趣阿
03/08 14:28, 11F
文章代碼(AID): #19iqg989 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #19iqg989 (C_and_CPP)