結構體的對其規則以及為什麼要對其

2021-10-21 09:59:33 字數 970 閱讀 2106

1. 第乙個成員在與結構體變數偏移量為0的位址處。

2. 其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。

對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。

(vs中預設的值為8)

3. 結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

4. 如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍

處,結構體的整 體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數

倍。

1. 平台原因(移植原因): 不是所有的硬體平台都能訪問任意位址上的任意資料

的;某些硬體平台只能 在某些位址處取某些特定型別的資料,否則丟擲硬體異常。

2. 效能原因: 資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。 原因在

於,為了訪問未對齊的 記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問

僅需要一次訪問。

總體來說:

結構體的記憶體對齊是拿空間來換取時間的做法。

//有乙個如下的結構體:

struct a

;//請問在64位編譯器下用sizeof(struct a)計算出的大小是多少?( )

/* 首先明確,64位下指標大小為8個位元組,這是關鍵,a1佔4位元組,a2兩位元組,

由於a3佔4位元組, a2需要補齊2個位元組,對於a1,a2,a3一共開闢了12個字

節,由於a4佔8個位元組,所以a3之後要 補齊4個位元組才能是8的整數倍,最

後總和為24位元組,剛好也是8的倍數,所以最終結構體大小為 24位元組

其次,32位下指標大小為4位元組,a1占用4位元組,a2占用2位元組,a3位元組數為4,

應對齊到4的整數倍8,故需要在a2後補充兩個位元組,a4位元組大小為4,剛好在字

節偏移12處儲存,故最終的結構體大小為16位元組。

*/

結構體在記憶體中的對其規則

乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include using namespace std struct x s1 voidmain 比如例一中的結構體變數s1定義之後,經測試,會發現sizeof s1 16,其值不等於sizeof s1.a 1 siz...

jvm動態年齡計算規則以及為什麼要這樣做

有乙個關鍵引數targetsurvivorratio。這個引數是年輕代物件動態晉公升老年代的關鍵引數。下面是虛擬機器中晉公升老年代計算的 uint agetable compute tenuring threshold size t survivor capacity uint result age...

結構體大小及其資料的對其原則

結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員自身大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 3 結構體的總大小為結構體最寬基本型別成...