C++類構造最佳化,類構造最佳化
假如有下面這樣一個類:
class A{public: A(int p, char q):x(p), c(q){ cout << "constructor called" << endl; } A(const A& a){x = a.x; c = a.c; cout << "copy constructor called" << endl;} ~A(){cout << "destructor called" << endl;}private: int x; char c;};如果按照下面的語句產生對象a:
A a = A(1,'a');
按照預想會先調用自訂建構函式產生臨時對象,而後調用拷貝建構函式,最後會發生兩次析構。
但是,實際上上述代碼經最佳化後只調用建構函式A(int,char),並不調用拷貝函數,而且只發生一次析構。即A a = A(1,'a');與A a(1,'a');是等價的。
C ++類的建構函式問題
當然能用了,這就是C++為什麼預設一個建構函式了,就是在你忘記寫自己的建構函式的時候依然能用!這個在JAVA裡照樣適用!!
C語言中用結構體類型構造結點,結點及數組名佔用記憶體的問題
有一點你要搞清楚,就是32位的機子上,不管什麼指標,都是4位元組(4×8bit=32bit,即32位),所以sizeof(next)是4位元組,因為next是指標。
還有一個概念是“位元組對齊”,詳細的話可以到網上搜一下。基本準則是這樣的:
位元組對齊的細節和具體編譯器實現相關,但一般而言,滿足三個準則:
1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;
2) 結構體每個成員相對於結構體首地址的位移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;
3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組。
對於node,它的記憶體分布是這樣的:
1****************************
int a 4個位元組
1****************************
2****************************
double b 8個位元組
2****************************
3****************************
char c 1個位元組
3個填充位元組 //double之後,以4位元組為增量,其中c佔了一個位元組,還有3個填充位元組
3****************************
4****************************
next 4個位元組
4****************************
5****************************
4個填充位元組 //準則3,最寬的成員double為8個位元組,而到next為止,只有20個位元組,不是8的倍數,所以又填充了4個位元組,於是總計24個位元組
5****************************
至於你說的a[2][2],sizeof(a)是計算的二位元組a佔用的總的記憶體,所以是16位元組,
sizeof(&a)則計算a這個指標本身所佔的記憶體,結果是4位元組
指向這個數組的指標,大小同樣始終是4位元組,因為32位機器上指標始終是4位元組
答題不易,望採納!