結構體的記憶體對齊

2021-06-09 21:26:28 字數 582 閱讀 5275

原則一:結構體中元素是按照定義順序乙個乙個放到記憶體中去的,但並不是緊密排列的。從結構體儲存的首位址開始,每乙個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變數首位址為0計算)。

原則二:在經過第一原則分析後,檢查計算出的儲存單元是否為所有元素中最寬的元素的長度的整數倍,是,則結束;若不是,則補齊為它的整數倍。

struct x

s5;struct x;

struct y

;

經測試,可知sizeof(x)為16,sizeof(y)為24。即計算y的儲存長度時,在存放第二個元素b時的初始位置是在double型的長度8的整數倍處,而非16的整數倍處,即系統為b所分配的儲存空間是第8~23個位元組。

如果將y的兩個元素char型的a和x型的b調換定義順序,則系統為b分配的儲存位置是第0~15個位元組,為a分配的是第16個位元組,加起來一共17個位元組,不是最長基本型別double所佔寬度8的整數倍,因此要補齊到8的整數倍,即24。測試後可得sizeof(y)的值為24。

結構體對齊(記憶體對齊

有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 structt 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實踐出真知,在vc6中測試了下,答案確實8個位...

記憶體對齊 結構體對齊

現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 重要規則 1,複雜型別中各個成員按照它們被宣告的順序在記憶體中順序儲存,第乙個成員的位址和整個型別的位...

結構體的記憶體對齊

結構體的記憶體對齊 乙個結構體變數定義完之後,其在記憶體中的儲存並不等於其所包含元素的寬度之和。例一 include 使用命名空間性病 結構x.p1 void main 比如例一中的結構體變數s1定義之後,測試發現sizeof p1 16,其值不等於sizeof p1.a 1,sizeof p1.b...