獲取結構體位元組數簡單的方法
結構體計算要遵循位元組對齊原則
結構體預設的位元組對齊一般滿足三個準則:
1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing padding)
其實 暫且不管這三原則,我的方法只要記住第三個,就是結構體大小結果要為成員中最大位元組的整數倍
先看下面定義的兩個結構體.
struct { char a; short b; char c; }S1;
struct { char a; char b; short c; }S2;
分別用程式測試得出sizeof(S1)=6 , sizeof(S2)=4
注意 為什麼 僅僅改變了結構體成員的順序,結果不一樣?
解:
(1)首先找出成員變數中最大的位元組,可見對於S1和S2 最大是short ,佔2個位元組,
(2)所以以後都已2個位元組為準,也就是說最多隻要2個位元組,其他填充佔位,注意下圖一個格子表示一個位元組,
(3)所以先畫2個格子,以後看成員順序,逐次增加,每次一2為增加基準
對於S1 ,來說,順序是 char->short->char
第一個char佔一個位元組 | 多的這一個補0,只是佔位作用 |
short 剛好佔2個位元組 | |
第二個char也佔1個 | 多的這一個補0 |
所以對於S1結構體大小為 2*3=6,至於為什麼第二個char,多的那個位元組不丟到,就是遵循第三個原則,就是結構體大小結果要為成員中最大位元組的整數倍
對於S2 嘛,也畫個圖,但是順序是 char->char->short
第一個char佔一個位元組 | 第二個char佔一個位元組 |
short 剛好佔2個位元組 |
S2=2*2=4
按照這個方法再看這樣的一個結構體:
struct stu1
{
int i;
char c;
int j;
};
很明顯:最大位元組為4個。順序int char int
int | int | int | int |
char | 0 | 0 | 0 |
第二個int | int | int | int |
因為 int佔4個,而char已經咱了一個,不夠,所以那三個只能多餘佔位
Stu1=3*4=12
那麼換一下呢?
struct stu2
{
int i;
int j;
char c;
};
Stu2=3*4=12;
再看一個:就是當結構體成員變數是另外一個結構體時,只要把結構體中成員為另一結構體作為整體相加就行
typedef struct A
{
char a1;
short int a2;
int a3;
double d;
};
A=16
typedef struct B
{
long int b2;
short int b1;
A a;
};
而對於B,先不要管A a,也就是先去掉A a 成員結構體B 算得 其為8,所以最後結果為8+16=24;踩