程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 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字節對齊方式對齊。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved