位元組(byte)是計算機資訊技術用於計量儲存容量和傳輸容量的一種計量單位,乙個位元組等於8位
二進位制數
,在utf-8編碼中,乙個英文
字元等於乙個位元組。位元組按照一定規則在空間上排列就是位元組對齊。
需要位元組對齊的根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為0x00000002,則cpu如果取它的值的話需要訪問兩次記憶體,第一次取從0x00000002-0x00000003的乙個short,第二次取從0x00000004-0x00000005的乙個short然後組合得到所要的資料,如果變數在0x00000003位址上的話則要訪問三次記憶體,第一次為char,第二次為short,第三次為char,然後組合得到整型資料。而如果變數在自然對齊位置上,則只要一次就可以取出資料。一些系統對對齊要求非常嚴格,比如sparc系統,如果取未對齊的資料會發生錯誤。
位元組對齊的幾大原則:
資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是陣列,結構體等)的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存。
結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存。(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始儲存。)
聯合體作為成員:按照其包含的長度最大的資料型別對齊。
收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍。不足的要補齊。
由於在x86下,gcc預設按4位元組對齊,比如:
struct stu;
struct stu my_stu;
它會在 *** 後面填充三個位元組,使其與 int 長度對齊,name 後面填充兩個位元組使整個結構體對齊,使得 sizeof(my_stu) 為 20(4 的倍數),而不是15。
#include using namespace std;
//#pragma pack(1)
typedef struct bb
bb;typedef struct aa
aa;int main()
結果是:48 24
對於 bb:4+[4]+8+4+[4]=24,其中 表示補齊的位元組數。
對於 a :2+[2]+4+8+2+[6]+24=48,同樣地, 表示補齊的位元組數。
再講講#pragma pack()。
在上述**前加一句 #pragma pack(1),則輸出的結果就變得很不一樣:32 16
對於 bb:4+8+4=16
對於 a:2+4+8+2+16=32
所有的補齊位元組都消失了,這就相當於沒有記憶體對齊的情況。#pragma pack(1) 就是告訴編譯器:所有的對齊都按照1的整數倍對齊,換句話說就是沒有對齊規則。
在預設情況下,c編譯器為每乙個變數或是資料單元按其自然對界條件分配空間。一般地,可以通過下面的方法來改變預設的對界條件:
我們可以按照自己設定的對齊大小來編譯程式,gnu使用__attribute__選項來設定,比如我們想讓剛才的結構按一位元組對齊,我們可以這樣定義結構體:
struct stu__attribute__ ((aligned (1)));
struct stu my_stu;
則sizeof(my_stu)可以得到大小為15。上面的定義等同於:
struct stu__attribute__ ((packed));
struct stu my_stu;
__attribute__((packed))得變數或者結構體成員使用最小的對齊方式,即對變數是一位元組對齊,對域(field)是位對齊。
1、2、
關於位元組對齊
用乙個例子簡單說明一下 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...
關於位元組對齊的總結
1 使用預設的位元組對齊方式。規則1 各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。注 下面列出常用型別的對齊方式 vc6.0,32位系統 型別 對齊方式 變數存放的起始位址相對於結構的起始位址的偏移量 char 偏移量必須為sizeof char 即...
關於位元組對齊的理解
位元組對齊的剖析 一 需要了解的名詞和概念 1 資料型別自身的對齊值 即資料本身所佔位元組長度。2 結構體或類的自身對齊值 即其中資料成員型別對齊值的最大值。3 指定對齊值 由程式設計人員通過 pragma pack value 指定的value值,通過 pragma pack 解除。4 結構體 類...