1.
什麼是結構體?
結構體是一種復合資料型別(具有相同和不同型別的資料構成的集合)
2.什麼是對齊?
現代計算機中記憶體空間都是按照
byte
劃分的,從理論上講,似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。
3.為什麼要進行結構體對齊?
結構體不像陣列,結構體可以存放不同型別的資料,
它的大小也不是簡單的各個資料成員大小之和,限於讀取記憶體的要求,而是每個成員在記憶體中的儲存都要按照一定偏移量來儲存,根據型別的不同,每個成員都要按照一定的對齊數進行對齊儲存,最後整個結構體的大小也要按照一定的對齊數進行對齊。
4.如何對齊?
預設情況下對齊是指按照結構體中成員
size
最大的對齊;利用
#pragra pack(n)
也可以指定對齊的位元組大小
n.(1)
在預設情況下結構體成員記憶體分配滿足三個條件
1.結構體第乙個成員位址和結構體首位址相同
2.每乙個成員偏移量是該成員的整數倍
3.結構體大小是該結構體位元組數最大成員的整數倍
例如:
structs1;
變數大小
偏移量ch10
a41+3b
81+3+4c11
1+3+4+8
所以總的大小為最後乙個變數的偏移量
+最後變數的大小
=1+3+4+8+1=17
,按照規則
3,則大小為
17+7=24
(2)
在指定#pragma pack(n)下,n
一定是2
的整數冪(
1,2,4,8,16….),
如果n大於結構成員中最大成員大小,則
n不起作用,依然按照預設方式對齊.
結構體對齊
現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragma pack規定的對齊長度,實...
結構體對齊
結構體對齊問題 以下結論均在gnu gcc上驗證 概念 偏移量 成員位址相對結構體位址的偏移 對齊原則 1.結構體中某成員的偏移量必須是該成員型別大小的整數倍 b 的偏移量必須是 short 大小的整數倍,故在 a 後面填充乙個位元組 c 的 型別大小是double,在ansi c中,c 的偏移量是...
結構體對齊
結構體對齊方式 1.pragma pack x 32系統預設值4,結構體元素最大長度,取三者最小值,作為每個元素對齊計算的值的倍數,並且總和是最小值的倍數!假的 於2015 12 26 修改 1.資料成員對齊原則 結構或聯合的資料成員,第乙個資料成員放在offset為0的地方,以後每個成員按照 pr...