Re: [問題] 為什麼作業系統都用C寫? 而不用C++呢?
關於 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
03/06 22:26, 1F
→
03/06 22:26, , 2F
03/06 22:26, 2F
推
03/06 22:28, , 3F
03/06 22:28, 3F
→
03/06 22:29, , 4F
03/06 22:29, 4F
→
03/06 22:30, , 5F
03/06 22:30, 5F
推
03/06 22:33, , 6F
03/06 22:33, 6F
→
03/06 22:34, , 7F
03/06 22:34, 7F
→
03/06 22:34, , 8F
03/06 22:34, 8F
→
03/06 22:37, , 9F
03/06 22:37, 9F
→
03/06 22:38, , 10F
03/06 22:38, 10F
→
03/06 22:38, , 11F
03/06 22:38, 11F
→
03/06 22:41, , 12F
03/06 22:41, 12F
推
03/06 22:43, , 13F
03/06 22:43, 13F
→
03/06 22:45, , 14F
03/06 22:45, 14F
推
03/06 22:50, , 15F
03/06 22:50, 15F
→
03/06 22:50, , 16F
03/06 22:50, 16F
→
03/06 22:53, , 17F
03/06 22:53, 17F
推
03/06 23:01, , 18F
03/06 23:01, 18F
→
03/06 23:10, , 19F
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
03/06 23:15, 23F
→
03/06 23:15, , 24F
03/06 23:15, 24F
→
03/06 23:15, , 25F
03/06 23:15, 25F
→
03/06 23:16, , 26F
03/06 23:16, 26F
→
03/06 23:17, , 27F
03/06 23:17, 27F
推
03/06 23:18, , 28F
03/06 23:18, 28F
推
03/06 23:18, , 29F
03/06 23:18, 29F
→
03/06 23:19, , 30F
03/06 23:19, 30F
→
03/06 23:48, , 31F
03/06 23:48, 31F
推
03/06 23:51, , 32F
03/06 23:51, 32F
推
03/07 00:00, , 33F
03/07 00:00, 33F
→
03/07 00:01, , 34F
03/07 00:01, 34F
推
03/07 00:31, , 35F
03/07 00:31, 35F
推
03/07 01:47, , 36F
03/07 01:47, 36F
討論串 (同標題文章)
完整討論串 (本文為第 7 之 37 篇):