記憶體位元組對齊
{
char a;
int e;
short f;
char b;
double d;
int c;
int g;
};
其中sizeof(charFirst)=32;
怎麼判斷記憶體對齊規則,sizeof的結果怎麼來的,請牢記以下3條原則:(在沒有#pragma pack巨集的情況下,務必看完最後一行)
1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第一個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是陣列,結構體等)的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍地址開始儲存。
2:結構體作為成員:如果一個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍地址開始儲存.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始儲存.)
3:收尾工作:結構體的總大小,也就是sizeof的結果,.必須是其內部最大成員的整數倍.不足的要補齊.
等你看完此3條原則,2分鐘已經過去,抓緊時間,實戰3分鐘:
typedef struct bb
{
int id; //[0]....[3]
double weight; //[8].....[15] 原則1
float height; //[16]..[19],總長要為8的整數倍,補齊[20]...[23] 原則3
}BB;
typedef struct aa
{
char name[2]; //[0],[1]
int id; //[4]...[7] 原則1
double score; //[8]....[15]
short grade; //[16],[17]
BB b; //[24]......[47] 原則2
}AA;
int main()
{
AA a;
cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
return 0;
}
結果是
48 24
ok,上面的全看明白了,記憶體對齊基本過關.
再講講#pragma pack().
在程式碼前加一句#pragma pack(1),你會很高興的發現,上面的程式碼輸出為
32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;
這不是理想中的沒有記憶體對齊的世界嗎.沒錯,#pragma pack(1),告訴編譯器,所有的對齊都按照1的整數倍對齊,換句話說就是沒有對齊規則.
明白了不?
那#pragma pack(2)的結果又是多少呢?對不起,5分鐘到了,自己去測試吧.
ps:Vc,Vs等編譯器預設是#pragma pack(8),所以測試我們的規則會正常;注意gcc預設是#pragma pack(4),並且gcc只支援1,2,4對齊。套用三原則裡計算的對齊值是不能大於#pragma pack指定的n值。
相關文章
- iOS 記憶體位元組對齊iOS記憶體
- C語言:記憶體位元組對齊詳解C語言記憶體
- C/C++—— 記憶體位元組對齊規則C++記憶體
- c++記憶體中位元組對齊問題詳解C++記憶體
- 位元組對齊
- golang 位元組對齊Golang
- 記憶體對齊記憶體
- 位元組對齊小談
- C++ 位元組對齊C++
- GO 記憶體對齊Go記憶體
- 理解記憶體對齊記憶體
- <摘錄>位元組對齊(強制對齊以及自然對齊)
- c/c++ 位元組對齊C++
- 結構體記憶體對齊結構體記憶體
- C++ 記憶體對齊C++記憶體
- 關於記憶體對齊記憶體
- C# 記憶體對齊C#記憶體
- 【C/C++】5.位元組對齊和位元組填充C++
- C語言記憶體對齊C語言記憶體
- C/C++ 結構體位元組對齊詳解C++結構體
- 【C++】C++的位元組對齊C++
- c 結構體記憶體對齊詳解結構體記憶體
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- iOS探索 記憶體對齊&malloc原始碼iOS記憶體原始碼
- C/C++記憶體對齊詳解C++記憶體
- C/C++記憶體對齊原則C++記憶體
- <摘錄>位元組對齊與結構體大小結構體
- 淺談虛擬函式表與位元組對齊函式
- Netty原始碼解析 -- 記憶體對齊類SizeClassesNetty原始碼記憶體
- Slab: 保證JVM的堆記憶體對齊JVM記憶體
- C結構體中資料的記憶體對齊問題結構體記憶體
- 點陣圖四位元組對齊問題
- 記憶體對齊巨集定義的簡明解釋記憶體
- struct結構體大小的計算(記憶體對齊)Struct結構體記憶體
- 從 CPU 角度理解 Go 中的結構體記憶體對齊Go結構體記憶體
- linux 改變GCC編譯器的位元組對齊方式LinuxGC編譯
- 【編譯製導指令】#pragma pack - 位元組數基準對齊編譯
- Windows+GCC下記憶體對齊的常見問題WindowsGC記憶體