C C 結構體內存分布

2022-10-10 21:57:19 字數 1057 閱讀 9971

參考文章: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)typedef 

struct

//總共占用9位元組

C C 結構體內存對齊

c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會...

C C 結構體內存對齊

c c 類 結構體內存遵循三個原則 c 中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之...

c c 結構體內存對齊

以上輸出的結果並非實際成員占用的位元組數,這就是結構體的記憶體對齊!1.平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料 某些硬體平台只能在某些特定位址處取某些特定的資料,否則就會丟擲硬體異常 也就是說在計算機在記憶體讀取資料時,只能在規定的位址處讀資料,而不是記憶體中任意位址都是...