C++結構體字節對齊示例

示例代碼

#include <iostream>    //輸入輸出流
using namespace std;
#include <vector>      //容器
struct MyStruct
{
   unsigned char start1;
   unsigned char start2;
   unsigned char test1[7];
};
struct header
{
   unsigned char by; //1字節
   unsigned int dw; //4字節
   int flag; //4字節
};
typedef unsigned char UCHAR;    //定義無符號字符變量的別名
typedef unsigned int UINT;      //定義無符號整型變量的別名
const int PREAMBLE_LENGTH = 7;   //定義整型常量,前導碼占7個字節
const int START_LENGTH = 1;      //幀前定界符占1個字節
const int DESADD_LENGTH = 6;     //目的地址
const int SOURCEADD_LENGTH = 6;  //源地址
const int TYPE_LENGTH = 2;       //類型字段
const int FCS_LENGTH = 4;        //幀校驗地址
class MyFrame1
{
public:
   UCHAR preamble[PREAMBLE_LENGTH];     //前導碼
   UCHAR start;                         //幀前定界符,標明下一個字節為目的MAC字段
   UCHAR dest_add[DESADD_LENGTH];       //指明幀的目的地址
   UCHAR source_add[SOURCEADD_LENGTH];  //指明幀的源地址
   UCHAR type[TYPE_LENGTH];             //幀中數據的協議類型
   vector <UCHAR> data;                  //vector <UCHAR>占16字節    定義數據的容器存儲數據字段
   UCHAR fcs[FCS_LENGTH];               //幀校驗序列
};
int main()
{
   MyStruct struct1;
   cout << sizeof(struct1)<<endl;
   header str1;
   cout << sizeof(str1) << endl;
   MyFrame1 fram1;
   cout << sizeof(fram1) << endl;
    return 0;
}

以上代碼我定義瞭2個結構體,1個類,類的本質也是結構體。因為運行環境是32位,所以在用sizeof計算結構體或者類的大小時,可能會出現字節對齊的現象,就是sizeof的結果是4的整數倍,從下圖中可以看到struct1結構體變量沒有發生字節對齊,而str1結構體變量和fram1類對象的統計大小時,均發生瞭字節對齊現象(str1結構體變量定義瞭9個字節,對齊到12字節,而MyFrame類原本占42字節,對齊到44字節)

不想讓結構體自動對齊怎麼辦

在頭文件當中添加#pragma pack(1)即可

#include <iostream>    //輸入輸出流
using namespace std;
#include <vector>      //容器
#pragma pack(1)         #按1個字節對齊,這樣相當於就沒有內存對齊

添加之後結果

這樣就不會自動字節對齊瞭

以上就是C++結構體字節對齊示例的詳細內容,更多關於C++結構體字節對齊的資料請關註WalkonNet其它相關文章!

推薦閱讀: