參考文章:c++中的結構體所佔記憶體空間總結 - fengmisaka - (cnblogs.com)
在c c++中,一般情況下。struct 的 sizeof 是所有成員位元組對齊後長度相加,而 union 的 sizeof 是取最大的成員長度,再相加。
(1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除。
(2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是當前成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組。
(3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組。
需要注意的是,基本型別是指前面提到的像 char、short、int、float、double 這樣的內建資料型別。如果乙個結構體中包含另外乙個結構體成員,那麼此時最寬基本型別成員不是該結構體成員,而是取基本型別的最寬值。
(均以32位機為例,int型4位元組,long 4位元組,long long 8位元組。其實4位元組還是8位元組不止和平台有關,編譯器也會影響)
幾種可能的情況:
1.全部為同一種基礎型別:
typedef struct//成員均為1,不用補齊,總大小為3
2.有不止一種基礎型別
typedef struct//總共8位元組
typedef struct
32位機指標大小4位元組
typedef struct
3. 使用了#pragma pack(n)指令
這個指令會強制要求編譯器放棄位元組對齊,而是要求按照n個位元組對齊。但如果大於所有成員的長度,n不會起作用
#pragma pack(1)typedefstruct
//總共占用9位元組
C C 結構體內存對齊
c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會...
C C 結構體內存對齊
c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之...
c c 結構體內存對齊
以上輸出的結果並非實際成員占用的位元組數,這就是結構體的記憶體對齊!1.平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料 某些硬體平台只能在某些特定位址處取某些特定的資料,否則就會丟擲硬體異常 也就是說在計算機在記憶體讀取資料時,只能在規定的位址處讀資料,而不是記憶體中任意位址都是...