c/c++中使用sizeof計算union/struct/class

Union求sizeof

union的結構類似於struct,但是他的存儲方式爲共享內存存儲。即在一時刻只能存儲一個數據類型。所以在計算union時應該計算最大的數據類型
union u{
float a;
int b[5];
char c;
}
sizeof u;//20



結構體求sizeof

在默認情況下,爲了方便對結構體內元素的訪問和管理,當結構體內的元素長度都小於處理器的位數的時候,便以結構體內最長的數據元素爲對齊單位,也就是說,結構體的長度一定是最長的數據元素的整數倍。如果結構體內存在的長度大於處理器位數的,那麼就以處理器的位數爲對齊單位。結構體內類型相同的連續元素,將在練習的空間內,和數組一樣。多說無益,直接看程序。

struct {short a1;short a2;short a3;} A;
struct {short a1;long a2;} B;

cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;


大家猜測結果是什麼呢?

很多人以爲是:6和6

正確答案是:6和8


爲什麼呢?

結構體A中有三個short類型的變量,各自以2字節對齊,長度爲6字節。6是最大長度2的整數倍。故sizeof(A)=6;

結構體B中,long 佔用4個字節,short佔用2個字節,共6個字節,但是6不是4的整數倍,於是需要補空自己,增到8字節,即sizeof(B)=8

對類求sizeof

關於類,我將以兩個例子來說明

列1:
class Student{
	public :
		bool isGirl;
		int age;
		bool beautiful;
};
cout<<sizeof(Student);




結果爲:12

列2:
class Student{
	public :
                int age;
		bool isGirl;
		bool beautiful;
};
cout<<sizeof(Student);


結果:8
爲什麼會出現這種情況呢?
解析:這跟內存中數據對齊有關係。
列1對齊方式
|---------bool----------------|---------------------|---------------------|----------------------------|   三個字節用空格填充
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|---------------------|---------------------|----------------------------|   三個字節用空格填充
故12個字節
列2對齊方式
|----------------------------------------------------int------------------------------------------------|
|---------bool----------------|----------bool-----------|---------------------|----------------------|   2個字節用空格填充
故8個字節
列3:
class Student{
	public :
		int age;
                static int schoolNum;
		
};
cout<<sizeof(Student)<<endl;


結果:4
解析:因爲靜態變量式存放在全局數據區的,而sizeof計算棧中分配的大小,所以sizeof(Student)=4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章