作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 為什麼作業系統都用C寫? 而不用C++呢?
時間Fri Mar 6 22:22:56 2009
關於 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