計算機中的記憶體都是按照byte為單位進行分配,在理論上資料可以儲存在記憶體中的任意位置。計算機為了提高工作效率,一般要求記憶體中的資料存放在特定的位置,使計算機用最少的機器週期便可以訪問到這個資料,這就是c語言中的記憶體對齊問題。
這裡以 int 型資料為例,如果記憶體中的資料按照4位元組對齊儲存,則計算機則可以在乙個讀取週期內取得資料,如果該資料的存放位置正好跨越的計算機的兩個讀取週期,便降低了計算機的執行效率。整體來言,計算機通過記憶體對齊的方式以犧牲計算機儲存空間的代價贏得了執行效率。下面通過幾個例項分析一下記憶體對齊原則。
記憶體對齊的原則:
1.結構體內部的成員按照自身的長度進行對齊
2.結構體本身的對齊值取內部成員中的最大值
3.當使用#pragma pack(n) 巨集指定對齊值時,結構體對齊值取 n和結構體最長內部成員 中的較小值
4.在gnu c中若使用特殊屬性 __attribute__((aligned(n))) 則強制使用 n 作為記憶體對齊值, 若使用__attribute__((packed)) 則表示使用可能最小的值 進行記憶體對齊。
下面看一段**
struct a
a1;void main()
正確輸出的結果為
分析:
a 按照1 位元組對齊,可以存放在記憶體中的任意位置,b只能按照4位元組對齊 ,所以a後面只能空3個位元組然後再存放b以滿足b 4位元組對齊的儲存條件,c按照1位元組對齊可以直接存放在b後面的位址空間中,但結構體對齊位元組按照成員中的最大值也就是4位元組對齊。所以結構體本身也要滿足記憶體對齊條件,所以變數c後面也要空3個位元組。最終答案也就是1+3+4+1+3 = 12
其餘例子不再多說,只要按照記憶體對齊的規則進行推導總能得到正確的結果。
C語言結構體對齊 記憶體對齊問題
c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?有人給對齊原則做過總結,具體在 看到現在已記不起來,這裡引用一下前人...
C語言中記憶體對齊問題
在日常的開發工作中,時常要用到結構體的定義工作,但是結構體中資料的定義順序是否合理直接影響了結構體所佔記憶體的大小,所以了解c語言中記憶體對齊的知識十分有必要。關於記憶體對齊的原則,我們首先討論沒有定義巨集 pragam pack 的情況,在該巨集沒有定義的情況之下,c語言中結構體的記憶體對齊問題主...
C語言記憶體對齊問題小結
記憶體對齊 結構體成員存放的位址要能整除該成員本身的大小 記憶體對齊的原則 1.前面所有成員的大小相加,應該是當前成員大小的倍數 2.整個結構體的大小應該能整除該結構體中單個最大成員的倍數 ps 每個資料型別的大小注釋在後面 舉個栗子 struct a 8定義乙個結構體a,根據第一條原則,需要將成為...