結構體對齊

2022-10-10 18:51:09 字數 996 閱讀 6664

1.

什麼是結構體?

結構體是一種復合資料型別(具有相同和不同型別的資料構成的集合)

2.什麼是對齊?

現代計算機中記憶體空間都是按照

byte

劃分的,從理論上講,似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。

3.為什麼要進行結構體對齊?

結構體不像陣列,結構體可以存放不同型別的資料,

它的大小也不是簡單的各個資料成員大小之和,限於讀取記憶體的要求,而是每個成員在記憶體中的儲存都要按照一定偏移量來儲存,根據型別的不同,每個成員都要按照一定的對齊數進行對齊儲存,最後整個結構體的大小也要按照一定的對齊數進行對齊。

4.如何對齊?

預設情況下對齊是指按照結構體中成員

size

最大的對齊;利用

#pragra pack(n)

也可以指定對齊的位元組大小

n.(1)

在預設情況下結構體成員記憶體分配滿足三個條件

1.結構體第乙個成員位址和結構體首位址相同

2.每乙個成員偏移量是該成員的整數倍

3.結構體大小是該結構體位元組數最大成員的整數倍

例如:

struct

s1;

變數大小

偏移量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...