Re: [問題] 為什麼作業系統都用C寫? 而不用C++呢?
看板C_and_CPP (C/C++)作者littleshan (我要加入劍道社!)時間16年前 (2009/03/08 12:33)推噓3(3推 0噓 8→)留言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
03/08 12:52, 2F
→
03/08 12:53, , 3F
03/08 12:53, 3F
推
03/08 13:48, , 4F
03/08 13:48, 4F
→
03/08 13:50, , 5F
03/08 13:50, 5F
→
03/08 13:51, , 6F
03/08 13:51, 6F
→
03/08 13:51, , 7F
03/08 13:51, 7F
→
03/08 13:55, , 8F
03/08 13:55, 8F
→
03/08 13:56, , 9F
03/08 13:56, 9F
→
03/08 14:26, , 10F
03/08 14:26, 10F
推
03/08 14:28, , 11F
03/08 14:28, 11F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 26 之 37 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章