国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

淺析C++字節對齊容易被忽略的兩個問題

2020-01-26 15:58:14
字體:
來源:轉載
供稿:網友
在這里就分享兩條開發中曾經忽略的問題:
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字節對齊方式對齊。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汾西县| 房山区| 三河市| 达尔| 万山特区| 阜南县| 彭泽县| 凤山市| 镇远县| 秦皇岛市| 阿拉善左旗| 施甸县| 星子县| 交口县| 新沂市| 醴陵市| 长岭县| 枞阳县| 三门县| 江华| 江山市| 临夏县| 彰化市| 石泉县| 西丰县| 西盟| 淮安市| 康平县| 互助| 突泉县| 武宁县| 金昌市| 千阳县| 安泽县| 西峡县| 同江市| 沧源| 米易县| 扶沟县| 淮北市| 仁布县|