關於記憶體對齊的小總結

2021-06-01 01:40:24 字數 1040 閱讀 3969

對齊規則:

1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照 #pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

3、結合1、2推斷:當#pragma pack的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。

4.各成員變數存放的起始位址相對於結構的起始位址的偏移量必須為該變數的型別所占用的位元組數的倍數。

5.各成員變數在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的位元組自動填充。

6.同時為了確保結構的大小為結構的位元組邊界數(即該結構中占用最大空間的型別所占用的位元組數)的倍數,所以在為最後乙個成員變數申請空間後,還會根據需要自動填充空缺的位元組。

ps:不同編譯器預設的最大對齊位元組數是不一樣的,比如vc==8,gcc==4,可以通過#progma pack (n)來修改,分析程式的時候要注意編譯器的區別

以下示例**:

我們還是先來看一段簡單的程式:

#include using namespace std;

struct x1

;struct x2

;struct x3

;int main()

;

union占用記憶體的長度等於最大的成員的長度,且按照對齊規則2,選擇以double的長度進行整體對齊,因此占用兩個double的長度即16

如果剔除其中的 double型資料,則結果應該為12,即 3個int的長度

關於對齊規則的第四條驗證一下例子可得

struct x;//整體以int大小對齊(注意 0~11已經是3x4個int了,所以12這個位置放了e,整體對齊之後的大小sizeof(x) = 16)

關於結構體內存對齊總結

記憶體對齊計算可謂是筆試題的必考題,但是如何按照計算原則算出正確答案一開始也不是很容易的事,所以專門通過例子來複習下關於結構體內存對齊的計算問題。編譯環境為vs2015 對齊原則 原則1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,...

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...

關於記憶體對齊

早上看了乙個貼的面試題,struct st int i short s char c sizeof struct st 是多少?int 4,short 2,char 1,但是sizeof st 是8。這個就是記憶體對齊 再來看個例子 struct strt1 strt1 s1 假設s1.c1位址為0...