c語言中結構體內存對齊規則
對齊規則:
記憶體偏移為該資料型別的最小整數倍
總體占用記憶體為結構體中最大資料型別的整數倍
舉個?:
首先,要搞清楚每一種資料型別占用記憶體為多少,在這裡,是針對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))
;
輸出結果為:
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*:
8test[
5517
:167810
]int:4
test[
5517
:167810
]short
:2
typedef
struct
;char ddf;
}sl;
分析過程int
main
(int argc,
const
char
* ar**)
return0;
}
輸出結果:
2019-12
-1522:
35:17.371774
+0800 test[
5079
:150310]56
program ended with exit code:
0
從這裡可以看出,總體占用記憶體空間為56
個位元組
分析:
根據上面占用位元組可知:char * a
指標型別占用8
個位元組
根據上面占用位元組可知:char b
占用1
個位元組,所以,到這裡,占用位元組數為9
同2中可知,char c
占用1
個位元組所以,到這裡,占用位元組總數為10
根據上面占用位元組可知:short e
占用2
個位元組,這裡要注意需要對齊2的最小整數倍,在這裡,因為已經到了10,正好是2的最小整數倍,所以,從10開始占用2個位元組,加起來應該是12
個位元組
根據上面占用位元組可知:int aa
占用4
個位元組,要對齊4的最小整數倍,12正好是4的整數倍,所以,從12開始占用4個位元組,到這裡一共占用位元組數為16
根據上面占用位元組可知:long bbb
占用8
個位元組,這裡要對齊8的最小整數倍,現在已經是16了,正好是8的整數倍,所以從16開始,占用8個位元組,到這裡為24
short ddd
占用2
個位元組,對齊2的整數倍,從24開始占用2
個位元組,到這裡一共占用26
結構體中分析方法和正常分析方法乙個邏輯:int ccc
占用4
個位元組,要對齊4的已占用記憶體的最小整數倍,4*8 = 32,所以要從32
開始占用4個位元組,最後為36
short bb
,占用2
個位元組,對齊2的整數倍,從36開始,占用2個位元組,最後為38
char * ee
占用8
個位元組,要對齊8的整數倍,從40
開始,占用8個位元組,最後為48
最後乙個char ddf
,占用1
個位元組,到這裡為49
最後輸出結果為什麼是56
呢,根據上述對齊原則,輸出結果為結構體中最大占用位元組的整數倍,結構體中最大占用位元組為8
,現在總占用位元組數為49
,所以輸出為8的整數倍56
結構體內存對齊規則
今天又聽了一遍結構體內存對齊規則,明白了 按照結構體內存規則來計算,再遇到結構體套結構體或結構體套陣列的情況,也能計算清楚。include stdafx.h include include include include struct tagtest 結構成員的對齊開始位址由結構成員size和預設對...
結構體內存對齊規則
記憶體對齊是出於提高記憶體訪問效率的考慮,其記憶體對齊規則如下 1 結構體中第乙個成員的位址偏移 offset 為0 2 其餘成員按照定義順序,其位址偏移量為各自對齊數的整數倍 3 最終結構體的整體大小為其最大對齊數的整數倍,不足在末尾補齊。4 對於內部巢狀了結構體的情況,其對齊數為該內嵌結構體的最...
結構體內存對齊規則
4.補充 5.總結 宣告乙個結構體型別,它所佔位元組為所有成員的位元組的總和?顯然是錯誤的基本的資料型別有char int double float。這個條件是很重要的,當你把結構體所佔記憶體位元組數算出來以後,你不要立即下結論,這個時候你要看看此時的值是否為最寬基本資料型別大小的整數倍。而往往有人...