C C 位元組對齊

2021-07-01 18:21:51 字數 835 閱讀 7773

概念: 對齊跟資料在記憶體中的位置有關。如果乙個變數的記憶體位址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設乙個整型變數的位址為0x00000004,那它就是自然對齊的。

為什麼位元組需要對齊:根本原因在於cpu訪問資料的效率問題。假設上面整型變數的位址不是自然對齊,比如為0x00000002,則cpu如果取它的值的話需要訪問兩次記憶體,第一次取從0x00000002-0x00000003的乙個short,第二次取從0x00000004-0x00000005的乙個short然後組合得到所要的資料,如果變數在0x00000003位址上的話則要訪問三次記憶體,第一次為char,第二次為short,第三次為char,然後組合得到整型資料。而如果變數在自然對齊位置上,則只要一次就可以取出資料。

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

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

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

注:vc,vs等編譯器預設是#pragma pack(8),所以測試我們的規則會正常;注意gcc預設是#pragma pack(4),並且gcc只支援1,2,4對齊。套用三原則裡計算的對齊值是不能大於#pragma pack指定的n值。

C C 位元組對齊

什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...

c c 位元組對齊

什麼是對齊,以及為什麼要對齊 現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...

C C 位元組對齊

1 背景 陣列 按照基本資料型別對齊,第乙個對齊了後面的自然也就對齊了。聯合 按其包含的長度最大的資料型別對齊。結構體 結構體中每個資料型別都要對齊。本文重點分析結構體的對齊方式。2 結構體中位元組對齊的案例分析 2.1 結構體一 struct a a 由於本結構體最大的成員是4位元組對齊,因此本結...