先了解下c/c++基本型別的位元組占用情況,
pragma pack 規定的對齊長度,實際使用的規則是:
也就是說,當#pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。
再來看個例子:
#include using上面的例子中,這個struct 實際佔據的記憶體空間是9位元組,但sizeof返回的是12,原因:namespace
std;
#define offset(struct_type, member) ((size_t) &((struct_type *) 0)->member)
#pragma pack(4)
struct
testb
;#pragma pack()
intmain()
結構之間的對齊,是按照結構內部最大的成員的長度,和#pragma pack規定的值之中較小的乙個對齊的。
所以這個例子中,結構之間對齊的長度是min(sizeof(int), 4),也就是4。 4的倍數且比8(最後乙個成員的偏移)大的是12,所以整個結構的占用位元組數是12。
上面的例子中,去掉第乙個int成員再來看:
#pragma pack(4)這個例子中,結構之間對齊的長度是min(sizeof(short), 4),也就是2。 2的倍數且比4(最後乙個成員的偏移)大的是6,所以整個結構的占用位元組數是6。struct
testb
;#pragma pack()
intmain()
換一種修改,只修改pragma的值,
#pragma pack(2)有陣列的情況:struct
testb
;#pragma pack()
intmain()
#pragma pack(4)修改pack引數:struct
testb
;#pragma pack()
intmain()
#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劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定變數的時候經常在特定的記憶體位址訪問,這就需要各型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。對齊的作用和原因 各...