#if defined(__GNUC__)
#define DEBUG_PACKED __attribute__((__packed__))
#define DEBUG_BEGIN_PACKED
#define DEBUG_PACKED_ALIGN_N(N) __attribute__((packed, aligned(N)))
#define DEBUG_BEGIN_PACKED_ALIGN_N(N)
#define DEBUG_END_PACKED
#else
#define DEBUG_PACKED
#define DEBUG_BEGIN_PACKED \
__pragma(pack(push, 1))
#define DEBUG_BEGIN_PACKED_ALIGN_N(N) \
__pragma(pack(push, N))
#define DEBUG_END_PACKED \
__pragma(pack(pop))
#define DEBUG_PACKED_ALIGN_N(N)
#endif // defined(__GNUC__)
我们知道常见的编译器默认是4字节对齐的(由于32位内存的存取方式,4字节对齐可以加速cpu访问内存的速度)。
也就是说下面的结构体默认是size 8的,但是如果去改对齐方式为1,那么size为5。
typedef struct {
int8_t cmd;
int32_t index;
} temp;
GUNC为编译器内置宏:
https://www.cnblogs.com/cccarl/p/7215515.html
GUNC表明为GCC编译器,无法在windows平台使用 __attribute__((__packed__)) 。
如果统一改成#pragma pack的形式就可以同时在windows和Linux下使用了。
__attribute__((packed))和__attribute__((packed, aligned(1)))是等价的。(aligned(x)就是告诉编译器,以x个字节为单位进行对齐,x只能是1,或2的幂)。也与#pragma pack(1)是等价的。
改内存对齐为1,可以更好地做到跨平台兼容。