C++位元組對齊容易被忽略的兩個問題

來源:互聯網
上載者:User

今天我就和大家分享一下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位元組對齊對齊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.