淺析C++字節對齊輕易被疏忽的兩個成績。本站提示廣大學習愛好者:(淺析C++字節對齊輕易被疏忽的兩個成績)文章只能為提供參考,不一定能成為您想要的結果。以下是淺析C++字節對齊輕易被疏忽的兩個成績正文
在這裡就分享兩條開辟中已經疏忽的成績:
1、Union(結合體)的字節對齊
先看代碼:
#pragma pack(4)
struct com
{
union
{
double dTest;
int nTest;
char szTest[14];
};
char chTest1;
char chTest2;
};
#pragma pack()
sizeof(struct com) = ?
gcc 4.1 和 vc 2005情況下,謎底是20。
調試一下構造體的內存結構,發明,union本身增長了2個字節的填充,用來堅持Union自己的4字節對齊。
即union在內存中釀成:
union
{
double dTest;
int nTest;
char szTest[14];
byte Padding1[2];
};
如許union就釀成了16字節,加上2個char類型的字節後,為了堅持struct的本身字節對齊,在struct末尾再填充兩字節.
終究構造體的內存結構是如許的:
#pragma pack(4)
struct com
{
union
{
double dTest;
int nTest;
char szTest[14];
byte Padding1[2];
};
char chTest1;
char chTest2;
byte Padding2[2];
};
#pragma pack()
2、分歧編譯器情況默許字節對齊的差異
做平台移植的同仁要留意了,碰到不肯定的字節對齊成績,最好先親身試一下,不克不及太想固然了:
(1)Win32下,VC編譯器默許8字節對齊,並且支撐1、2、4、8、16五種對齊方法。
(2)Linux 32下,GCC 4.1默許4字節對齊,支撐1、2、4三種對齊方法。是以構造體
中即便碰到double、long long如許的8字節變量,依然按4字節對齊。即便設定了#pragma pack(8)
(3)安卓4.0, arm cpu的NDK編譯情況,默許情形下,碰到double、long long類型的變量時,分歧於PC Linux 32,會依照8字節對齊方法對齊。