C語(yǔ)言中結(jié)構(gòu)體內(nèi)存對(duì)齊規(guī)則
對(duì)齊規(guī)則:
- 內(nèi)存偏移為該數(shù)據(jù)類型的最小整數(shù)倍
- 總體占用內(nèi)存為結(jié)構(gòu)體中最大數(shù)據(jù)類型的整數(shù)倍
舉個(gè):
首先,要搞清楚每一種數(shù)據(jù)類型占用內(nèi)存為多少,在這里酸员,是針對(duì)64位Linux(macOs)為例的
NSLog(@"char:%zd",sizeof(char));
NSLog(@"double:%zd",sizeof(double));
NSLog(@"long:%zd",sizeof(long));
NSLog(@"long long:%zd",sizeof(long long));
NSLog(@"char *:%zd",sizeof(char *));
NSLog(@"int:%zd",sizeof(int));
NSLog(@"short:%zd",sizeof(short));
輸出結(jié)果為:
Test[5517:167810] char:1
Test[5517:167810] double:8
Test[5517:167810] long:8
Test[5517:167810] long long:8
Test[5517:167810] char *:8
Test[5517:167810] int:4
Test[5517:167810] short:2
typedef struct {
char *a;
char b;
char c;
short e;
int aa;
long bbb;
short dddd;
struct {
int ccc;
short bb;
char *ee;
};
char ddf;
}SL;
分析過(guò)程
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSLog(@"%zd",sizeof(SL));
}
return 0;
}
輸出結(jié)果:
2019-12-15 22:35:17.371774+0800 Test[5079:150310] 56
Program ended with exit code: 0
從這里可以看出蛾绎,總體占用內(nèi)存空間為56
個(gè)字節(jié)
分析:
- 根據(jù)上面占用字節(jié)可知:
char * a
指針類型占用8
個(gè)字節(jié) - 根據(jù)上面占用字節(jié)可知:
char b
占用1
個(gè)字節(jié)悔详,所以,到這里链瓦,占用字節(jié)數(shù)為9
- 同2中可知,
char c
占用1
個(gè)字節(jié)所以盯桦,到這里澡绩,占用字節(jié)總數(shù)為10
- 根據(jù)上面占用字節(jié)可知:
short e
占用2
個(gè)字節(jié),這里要注意需要對(duì)齊2的最小整數(shù)倍俺附,在這里肥卡,因?yàn)橐呀?jīng)到了10,正好是2的最小整數(shù)倍事镣,所以步鉴,從10開(kāi)始占用2個(gè)字節(jié),加起來(lái)應(yīng)該是12
個(gè)字節(jié) - 根據(jù)上面占用字節(jié)可知:
int aa
占用4
個(gè)字節(jié)璃哟,要對(duì)齊4的最小整數(shù)倍氛琢,12正好是4的整數(shù)倍,所以随闪,從12開(kāi)始占用4個(gè)字節(jié)阳似,到這里一共占用字節(jié)數(shù)為16
- 根據(jù)上面占用字節(jié)可知:
long bbb
占用8
個(gè)字節(jié),這里要對(duì)齊8的最小整數(shù)倍,現(xiàn)在已經(jīng)是16了铐伴,正好是8的整數(shù)倍撮奏,所以從16開(kāi)始俏讹,占用8個(gè)字節(jié),到這里為24
-
short ddd
占用2
個(gè)字節(jié)畜吊,對(duì)齊2的整數(shù)倍泽疆,從24開(kāi)始占用2
個(gè)字節(jié),到這里一共占用26
- 結(jié)構(gòu)體中分析方法和正常分析方法一個(gè)邏輯:
int ccc
占用4
個(gè)字節(jié)玲献,要對(duì)齊4的已占用內(nèi)存的最小整數(shù)倍,4*8 = 32殉疼,所以要從32
開(kāi)始占用4個(gè)字節(jié),最后為36
-
short bb
,占用2
個(gè)字節(jié)捌年,對(duì)齊2的整數(shù)倍瓢娜,從36開(kāi)始,占用2個(gè)字節(jié)礼预,最后為38
-
char * ee
占用8
個(gè)字節(jié),要對(duì)齊8的整數(shù)倍恋腕,從40
開(kāi)始,占用8個(gè)字節(jié)逆瑞,最后為48
- 最后一個(gè)
char ddf
荠藤,占用1
個(gè)字節(jié),到這里為49
最后輸出結(jié)果為什么是56
呢获高,根據(jù)上述對(duì)齊原則哈肖,輸出結(jié)果為結(jié)構(gòu)體中最大占用字節(jié)的整數(shù)倍,結(jié)構(gòu)體中最大占用字節(jié)為8
念秧,現(xiàn)在總占用字節(jié)數(shù)為49
淤井,所以輸出為8的整數(shù)倍56