關於位元組對齊

2021-04-30 08:35:08 字數 1640 閱讀 4730

用乙個例子簡單說明一下(v6環境):

輸出結果:

char:1 long:4

s1: 8 s2: 16

結果分析(棧由高向低增長,小端位元組序):

addr(s1.l):      0x12ff7c

addr(s1.s):      0x12ff78

addr(s1):        0x12ff78

addr(s2.l):      0x12ff74

addr(s2.t.l):    0x12ff70

addr(s2.t.s):    0x12ff6c

addr(s2.t):      0x12ff6c

addr(s2.s):      0x12ff68

press any key to continue

簡圖為:

| |     0x12ff80  

| |   

| | 

| | 

s1.l ->  | |  0x12ff7c (s1.l佔4個位元組)

| || |  

| |s1.s (s1)-> | |   0x12ff78 (s1.s佔4個位元組,s1佔4+4=8個位元組)

| || | 

| |s2.l ->        | |  0x12ff74 (s2.l佔4個位元組)

| || | 

| |s2.t.l ->      | |  0x12ff70

| || | 

| |s2.t.s(s2.t) -> | |  0x12ff6c (s2.t佔8個位元組) 

| || |

| |s2.s ->  | | 0x12ff68 (s2.s佔4個位元組,s2佔4+8+4=16個位元組)

附轉四個重要的基本概念:

1.資料型別自身的對齊值(32位機):

對於char型資料,其自身對齊值為1,對於short型為2,對於int和float型別,其自身對齊值為4,對於double型別,其自身對齊值為8,單位位元組。

2.結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。

3.指定對齊值:#pragma pack (value)時的指定對齊值value。

4.資料成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中小的那個值。

有了這些值,我們就可以很方便的來討論具體資料結構的成員和其自身的對齊方式。有效對齊值n是最終用來決定資料存放位址方式的值。有效對齊n,就是表示「對齊在n上」,也就是說該資料的"存放起始位址%n=0"。而資料結構中的資料變數都是按定義的先後順序來排放的。第乙個資料變數的起始位址就是資料結構的起始位址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數占用總長度需要是對結構體有效對齊值的整數倍,結合例子理解)。這樣就不難理解上面的例子的值了。

注意:在x86上,從奇位址訪問變數類似的操作只會影響效率,但是在mips或者sparc上,可能就是乙個error,因為它們要求必須位元組對齊。

如果出現對齊或者賦值問題首先檢視:

1. 編譯器的big little端設定。

2. 看這種體系本身是否支援非對齊訪問。

3. 如果支援,檢視設定了對齊與否,如果沒有則檢視訪問時需要加某些特殊的修飾來標誌其特殊訪問操作。

下面是乙個小例子,這個例子涉及位元組大小端、位元組非對齊訪問問題。

關於位元組對齊

位元組 byte 是計算機資訊技術用於計量儲存容量和傳輸容量的一種計量單位,乙個位元組等於8位 二進位制數 在utf 8編碼中,乙個英文 字元等於乙個位元組。位元組按照一定規則在空間上排列就是位元組對齊。需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為...

關於位元組對齊的總結

1 使用預設的位元組對齊方式。規則1 各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。注 下面列出常用型別的對齊方式 vc6.0,32位系統 型別 對齊方式 變數存放的起始位址相對於結構的起始位址的偏移量 char 偏移量必須為sizeof char 即...

關於位元組對齊的理解

位元組對齊的剖析 一 需要了解的名詞和概念 1 資料型別自身的對齊值 即資料本身所佔位元組長度。2 結構體或類的自身對齊值 即其中資料成員型別對齊值的最大值。3 指定對齊值 由程式設計人員通過 pragma pack value 指定的value值,通過 pragma pack 解除。4 結構體 類...