結構體的位元組對齊,在筆試中經常考到,我們先給出結論,然後以兩道例題位元組對齊的計算方式。
(1)struct/class的自身對齊值。對於結構體和類的自身對齊值是所有成員中最大的自身對齊值。結構體和類的對齊原則:先將資料成員對齊,再將結構體和類自身對齊,最終大小與資料成員順序相關。
(2) union的自身對齊值是所有成員中最大的對齊值。union的對齊規則,只需要union自身對齊,不需要資料成員對齊,最終大小與資料成員順序無關。
(3) 指定對齊值。可以使用 #param pack(2)指定對齊值為n,使用#parama back()恢復預設對齊值(預設對齊值一般為4)
(4)有效對齊值。有效對齊值=min(類/結構體/成員的自身對齊值,指定對齊值)
(5)有效對齊值決定了資料存放的方式,sizeof運算子是根據有效對齊值計算大小的
struct data
;int
main()
輸出為8.
a的其實位址為0,結束位址為3,起始位址4是1(char的長度)的整數倍,因此b的位址為4.此時5不是2(short)的證書被因此填充到6,c的位址為5 ~ 7
輸出為12;
假設b的其實位址為0,起始位址1不為4(int的長度)的倍數,所以填充到4,注意c結尾也需要被填充。因此長度為12
輸出為8,與上面同理
using namespace std;
#pragma pack(2)
union ubfferubuf;
intmain()
若將#param pack(2)去掉,結果便為1 c語言位元組對齊
現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不...
C語言位元組對齊
一 概念 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int ...