再談位元組對齊

2021-05-22 00:31:45 字數 836 閱讀 2344

再談位元組對齊

2009-05-01 21:32

請牢記以下3條原則:(在沒有#pragma pack巨集的情況下)

1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存。

2:結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始儲存.)

3:收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊.

等你看完此3條原則,2分鐘已經過去,抓緊時間,實戰3分鐘:

typedef struct bb

bb;typedef struct aa

aa;int main()

{aa a;

cout《結果是

48 24

ok,上面的全看明白了,記憶體對齊基本過關.

再講講#pragma pack().

在**前加一句#pragma pack(1),你會很高興的發現,上面的**輸出為

32 16

bb是4+8+4=16,aa是2+4+8+2+16=32;

這不是理想中的沒有記憶體對齊的世界嗎.沒錯,#pragma pack(1),告訴編譯器,所有的對齊都按照1的整數倍對齊,換句話說就是沒有對齊規則.

明白了不?

那#pragma pack(2)的結果又是多少呢?對不起,5分鐘到了,自己去測試吧.

再談記憶體對齊

一 問題提出 怎樣的資料訪問是對齊的?很簡單 aligned c記憶體位址 資料大小 0 自然對齊 unaligned 不滿足上述規則,這個資料是非對齊的 簡單的說,就是char型別無對齊要求 short型別的資料位址最後一位是0 int型資料位址最後兩位為0 非對齊訪問對x86 sparc這類晶元...

位元組順序 位元組對齊

一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...

位元組順序 位元組對齊

一.位元組順序的產生 在計算機中,資料是以位元組為單位存放的,而c語言中只有char才是乙個位元組,其他如int,float都是大於乙個位元組,所以就存在將資料按怎樣的順序存放的問題。一般有大端序和小端序兩種方式,特殊的還有混合序,也就是兩種存放方式同時存在於乙個計算機系統中。上面講的都是主機位元組...