1、基本資料對齊
在x86,32位系統下基於microsoft、borland和gnu的編譯器,有如下資料對齊規則:
a、乙個char(占用1-byte)變數以1-byte對齊。
b、乙個short(占用2-byte)變數以2-byte對齊。
c、乙個int(占用4-byte)變數以4-byte對齊。
d、乙個long(占用4-byte)變數以4-byte對齊。
e、乙個float(占用4-byte)變數以4-byte對齊。
f、乙個double(占用8-byte)變數以8-byte對齊。
g、乙個long double(占用12-byte)變數以4-byte對齊。
h、任何pointer(占用4-byte)變數以4-byte對齊。
而在64位系統下,與上面規則對比有如下不同:
a、乙個long(占用8-byte)變數以8-byte對齊。
b、乙個double(占用8-byte)變數以8-byte對齊。
c、乙個long double(占用16-byte)變數以16-byte對齊。
d、任何pointer(占用8-byte)變數以8-byte對齊。
2、結構體資料對齊
結構體資料對齊,是指結構體內的各個資料對齊。在結構體中的第乙個成員的首位址等於整個結構體的變數的首位址,而後的成員的位址隨著它宣告的順序和實際占用的位元組數遞增。為了總的結構體大小對齊,會在結構體中插入一些沒有實際意思的字元來填充(padding)結構體。
在結構體中,成員資料對齊滿足以下規則:
a、結構體中的第乙個成員的首位址也即是結構體變數的首位址。
b、結構體中的每乙個成員的首位址相對於結構體的首位址的偏移量(offset)是該成員資料型別大小的整數倍。
c、結構體的總大小是對齊模數(對齊模數等於#pragma pack(n)所指定的n與結構體中最大資料型別的成員大小的最小值)的整數倍。
關於位元組對齊的一些問題
寫在前面,博主也是個菜鳥,只是在這裡分享一些自己遇到的問題,如有表述不當的地方請諒解。關於位元組對齊的問題其實很好理解,只要了解下cpu讀取資料的細節再動手實踐一下就一目了然了,下面是我了解到的cpu讀取資料時的一些細節和實踐的過程。首先看一下記憶體的排列 注釋 數字時位址,每格表示一位元組的位址。...
關於位元組對齊的理解
位元組對齊的剖析 一 需要了解的名詞和概念 1 資料型別自身的對齊值 即資料本身所佔位元組長度。2 結構體或類的自身對齊值 即其中資料成員型別對齊值的最大值。3 指定對齊值 由程式設計人員通過 pragma pack value 指定的value值,通過 pragma pack 解除。4 結構體 類...
關於位元組對齊的理解
結構體對齊 有的時候,在腦海中停頓了很久的 顯而易見 的東西,其實根本上就是錯誤的。就拿下面的問題來看 struct t 使用sizeof t 將得到什麼樣的答案呢?要是以前,想都不用想,在32位機中,int是4個位元組,char是1個位元組,所以t一共是5個位元組。實 踐出真知,在vc6中測試了下...