天天看點

c語言結構體位元組對齊問題

定義一個結構體,如:

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 的長度是:

c語言結構體位元組對齊問題

這是結構體按照編譯器預設的四位元組對齊問題,而若實際中不需要位元組對齊,而可以加入如下兩行代碼:

#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))
           

那麼編譯結果為:

c語言結構體位元組對齊問題

繼續閱讀