位元組對齊相關

2021-09-26 23:51:21 字數 1172 閱讀 5256

c/c++都是按照最大對齊補齊方式的,即按照佔空間最大成員來處理對齊,對齊是由於計算機系統的限制導致的。因為許多計算機系統對基本資料型別的合法位址做出了一些限制,要求某種型別物件的位址必須是某個值k(通常是2、4或8)的倍數。這種對齊限制簡化了形成處理和記憶體系統之間介面的硬體設計。

對齊限制可以提高讀寫記憶體的效率。例如對double型別資料,有了對齊限制,就可以用乙個記憶體操作來讀或者寫值了,否則可能需要執行兩次記憶體訪問,因為物件可能被放在兩個8位元組記憶體塊中。

對齊原則就是任何k位元組的基本物件的位址必須是k的倍數。也就是說乙個結構體的double成員大小是8位元組,則其位址在對齊原則下就必須是8的倍數。下面是各種基本型別對應的k值。k型別

1char

2short

4int,float

8long int,double

typedef struct  a;
因為a是4位元組,而b是8位元組的,則為了讓b滿足對齊要求,編譯器會在a和b中插入4個位元組。因為c是1位元組而d是4位元組,則編譯會在c和d之間插入3個位元組,從而讓d滿足對齊要求。最後結構體a的空間分配如下:

a對齊填充bc

對齊填充de

對齊填充

ps:最後一行只是為了表示每行8個位元組(去掉的話**就變形了)。

如果在c或者c++中呼叫上面的**,可以得到結果為32,sizeof會將e後面補齊的4個位元組也算進去。32是4*8,而8就是結構體a中佔空間最大成員b的位元組數。所以在計算占用空間的時候,要優先考慮到最大的成員位元組數。

注意,指標在32位作業系統中是佔4位元組,而在64位系統中佔8位元組,這一點在計算的時候需要考慮。

對齊限制不是必須的,在c++和c中可以通過巨集#pragma pack設定對齊方式。「#pragma pack(k)」是設定對齊方式為k位元組對齊,而「#pragma pack()」則是恢復為預設的對齊方式。

#include #include #pragma pack(1)

typedef struct b;

#pragma pack()

typedef struct a;

int main()

上面的**中,先將結構體b設定為1位元組對齊,然後再將結構體a設定為預設對齊。最終我們可以得到a結構的大小為32,而b結構的大小為10。

C語言位元組對齊的相關筆記

一 概念 對齊跟資料在記憶體中的位置有關。程式中如果乙個變數的記憶體位址正好位於它長度的整數倍,它就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。二 為什麼要位元組對齊 位元組對齊和cpu的資料訪問效率是有關係的。假設整型變數的位址不是自然對...

位元組順序 位元組對齊

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

位元組順序 位元組對齊

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