一.先了解c和oc不同類型所對(duì)應(yīng)字節(jié)如下圖

image.png
二.了解內(nèi)存對(duì)齊規(guī)則
*1:數(shù)據(jù)成員對(duì)?規(guī)則:結(jié)構(gòu)(struct)(或聯(lián)合(union))的數(shù)據(jù)成員,第
?個(gè)數(shù)據(jù)成員放在offset為0的地?,以后每個(gè)數(shù)據(jù)成員存儲(chǔ)的起始位置要
從該成員??或者成員的?成員??(只要該成員有?成員,?如說是數(shù)組,
結(jié)構(gòu)體等)的整數(shù)倍開始(?如int為4字節(jié),則要從4的整數(shù)倍地址開始存
儲(chǔ)。
列如 int a 如果起始為 7 那么 7 舍棄 從8開始 后面數(shù)4位 就是 8,9,10,11
*2:結(jié)構(gòu)體作為成員:如果?個(gè)結(jié)構(gòu)?有某些結(jié)構(gòu)體成員,則結(jié)構(gòu)體成員要從
其內(nèi)部最?元素??的整數(shù)倍地址開始存儲(chǔ).(struct a?存有struct b,b
?有char,int ,double等元素,那b應(yīng)該從8的整數(shù)倍開始存儲(chǔ).)
*3:收尾?作:結(jié)構(gòu)體的總??,也就是sizeof的結(jié)果,.必須是其內(nèi)部最?
成員的整數(shù)倍.不?的要補(bǔ)?.
三根據(jù)代碼分析結(jié)構(gòu)體內(nèi)存的大小
struct LGStruct1 {
double a; // 8 [0 7]
char b; // 1 [8]
int c; // 4 (9 10 11 [12 13 14 15]
short d; // 2 [16 17] 24 //LGStruct1 最大成員是a,8的整數(shù)倍且不能小于17 所以是 24
}struct1;
struct LGStruct2 {
double a; // 8 [0 7]
int b; // 4 [8 9 10 11]
char c; // 1 [12]
short d; // 2 (13 [14 15] 16 //LGStruct2 最大成員是a 8的整數(shù)倍且不能小于15 所以是 16
}struct2;
// 家庭作業(yè) : 結(jié)構(gòu)體內(nèi)存對(duì)齊
struct LGStruct3 {
double a; //8 [0 7]
int b; //4 [8 9 10 11]
char c; //1 [12]
short d; // 2 13 [14 15]
int e; // 4 [16 17 18 19]
struct LGStruct1 str; //因?yàn)長(zhǎng)GStruct1結(jié)構(gòu)體的實(shí)際內(nèi)存大小是17按照內(nèi)存原則取結(jié)構(gòu)體里面最大的成員變量開始 20 21 22 23 [24 ...41]LGStruct3里面最大成因是 LGStruct1 他的內(nèi)存大小是24 取24的整數(shù)倍是 48 所有內(nèi)存大小是48
}struct3;
-
輸出結(jié)果如下
image.png
從上面結(jié)果驗(yàn)證可以得出結(jié)論
- 1.結(jié)構(gòu)體內(nèi)存大小跟數(shù)據(jù)排列有關(guān)
- 2.結(jié)構(gòu)體的內(nèi)存大小與成員的內(nèi)存大小有關(guān)
