c/c++類/結構體內存遵循三個原則:
c++中結構跟類幾乎相同,除了預設成員的訪問控制不同。以下結構體的記憶體對齊在類class中也是一樣的。
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。
這樣就知道
struct t1;
為什麼sizeof(t1)是12位元組而不是6位元組了。
另外,可以對結構成員列表重新排列,讓那些對於邊界對齊要求最嚴格的成員首先出現,對邊界要求最弱的成員最後出現,可以減少記憶體損失。
比如t1可改為
structt1;
這樣sizeof(t1)只有8位元組。
對於在結構體中的結構體,
struct t;
structt2;此時考慮時還是將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中也是一樣的。結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之...
c c 結構體內存對齊
以上輸出的結果並非實際成員占用的位元組數,這就是結構體的記憶體對齊!1.平台原因 移植原因 不是所有的硬體平台都能訪問任意位址上的任意資料 某些硬體平台只能在某些特定位址處取某些特定的資料,否則就會丟擲硬體異常 也就是說在計算機在記憶體讀取資料時,只能在規定的位址處讀資料,而不是記憶體中任意位址都是...
c c 結構體 記憶體對齊原則
原則1 資料成員對齊規則 結構的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的倍數開始 比如int在32位機為4位元組,則要從4的整數倍位址開始儲存 原則2 結構體的總大小,也就是sizeof的結果。必須是其內部最大成員的整數倍。不足的要補齊。原則...