跨平台结构体字节对齐问题

7 篇文章 0 订阅
#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__)) 。

https://stackoverflow.com/questions/32208805/what-is-the-difference-between-attribute-packed-and-pragma-pack1

如果统一改成#pragma pack的形式就可以同时在windows和Linux下使用了。

__attribute__((packed))和__attribute__((packed, aligned(1)))是等价的。(aligned(x)就是告诉编译器,以x个字节为单位进行对齐,x只能是1,或2的幂)。也与#pragma pack(1)是等价的。

改内存对齐为1,可以更好地做到跨平台兼容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值