c c 的記憶體位元組對齊

2022-10-10 21:03:11 字數 1255 閱讀 3457

先了解下c/c++基本型別的位元組占用情況,

pragma pack 規定的對齊長度,實際使用的規則是: 

也就是說,當#pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。 

再來看個例子:

#include using

namespace

std;

#define offset(struct_type, member) ((size_t) &((struct_type *) 0)->member)

#pragma pack(4)

struct

testb

;#pragma pack()

intmain()

上面的例子中,這個struct 實際佔據的記憶體空間是9位元組,但sizeof返回的是12,原因:

結構之間的對齊,是按照結構內部最大的成員的長度,和#pragma pack規定的值之中較小的乙個對齊的。 

所以這個例子中,結構之間對齊的長度是min(sizeof(int), 4),也就是4。 4的倍數且比8(最後乙個成員的偏移)大的是12,所以整個結構的占用位元組數是12。

上面的例子中,去掉第乙個int成員再來看:

#pragma pack(4)

struct

testb

;#pragma pack()

intmain()

這個例子中,結構之間對齊的長度是min(sizeof(short), 4),也就是2。 2的倍數且比4(最後乙個成員的偏移)大的是6,所以整個結構的占用位元組數是6。

換一種修改,只修改pragma的值,

#pragma pack(2)

struct

testb

;#pragma pack()

intmain()

有陣列的情況:

#pragma pack(4)

struct

testb

;#pragma pack()

intmain()

修改pack引數:

#pragma pack(2)

struct

testb

;#pragma pack()

intmain()

參考:

C C 記憶體位元組對齊詳解

from 例1 include stdafx.h include using namespace std struct a struct b 換乙個順序 int main 其輸出結果為 24 換行 16 不同樣結構體包含相同的元素型別,為什麼得到的長度不相同呢?這就 牽扯到 資料對齊 1.什麼是資料...

記憶體對齊之主文 C C 位元組對齊詳解

發表於2010 年 09 月 05 日 由linuxsong 一.什麼是位元組對齊,為什麼要對齊?現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則...

C C 位元組對齊

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