定義一個結構體,如:
typedef unsigned char uint8_t;
typedef unsigned int uint32_t;
typedef long long uint64_t;
typedef struct
{
uint32_t crc;
uint8_t msgID;
float a;
uint8_t b;
uint64_t payload64[];
} m_MessageHeader;
結構體 m_MessageHeader 的長度是:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwFNnpHWxwWbiZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TNzUDOykTNyITOwUDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
這是結構體按照編譯器預設的四位元組對齊問題,而若實際中不需要位元組對齊,而可以加入如下兩行代碼:
#pragma pack(1)
typedef struct
{
uint32_t crc;
uint8_t msgID;
float a;
uint8_t b;
uint64_t payload64[];
} m_MessageHeader;
#pragma pack()
即結構體前後加上#pragma pack(1) 和#pragma pack(),括号中的1是按照一位元組對齊,也可以2、3等
自己需求的位元組對齊。
或者下面這種方式同樣可以,結構體前後加上 __pragma(pack(push,1)) 和 __pragma(pack(pop))。
__pragma(pack(push,))
typedef struct
{
uint32_t crc;
uint8_t msgID;
float a;
uint8_t b;
uint64_t payload64[2];
} m_MessageHeader;
__pragma(pack(pop))
那麼編譯結果為: