C C 結構體內存對齊

2021-06-25 19:37:52 字數 897 閱讀 1093

c/c++類/結構體內存遵循三個原則:

c++中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

結構體每個成員相對於結構體首位址的偏移量(offset)都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。

這樣就知道

struct   t1;
為什麼sizeof(t1)是12位元組而不是6位元組了。

另外,可以對結構成員列表重新排列,讓那些對於邊界對齊要求最嚴格的成員首先出現,對邊界要求最弱的成員最後出現,可以減少記憶體損失。

比如t1可改為

struct    t1;
這樣sizeof(t1)只有8位元組。

對於在結構體中的結構體,

struct t;
struct t2;
此時考慮時還是將t1中拆成各基本型別處理,t1中最寬型別成員的整數倍如果在t2中最大,就作為t2中最寬型別處理。

上述t2占用,4+12(結構體t1)+1+3=20

而這個例子

struct   test1   ; 

struct test2 ;

中sizeof(test2)=40

對於結構體中的指標

struct p

;

指標都是占用4個位元組。addr和pr,pb都是一樣的。

C C 結構體內存對齊

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

c c 結構體內存對齊

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

c c 結構體 記憶體對齊原則

原則1 資料成員對齊規則 結構的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的倍數開始 比如int在32位機為4位元組,則要從4的整數倍位址開始儲存 原則2 結構體的總大小,也就是sizeof的結果。必須是其內部最大成員的整數倍。不足的要補齊。原則...