c语言struct结构的64位移植

c语言struct结构的64位移植

#include <stdint.h>

struct tdb
{
uint32_t c;
uint64_t a;
uint64_t b;
};

64位系统默认按8个字节来align,所以tdb的第一个成员c会align成8个字节。这个struct在32位gcc上编译后的size是20个字节,而在64位上的size是24个字节,这个struct tdb是要写入文件的(实际上是通过mmap),这下就不能通用了。解决办法之一是加再加一个uint32_t的成员来“填充”这个空缺:

struct tdb
{
uint32_t c;
uint32_t align;
uint64_t a;
uint64_t b;
};

同样的
struct page
{
ushort c;
uint64_t a;
};

也要改为
struct page
{
ushort b;
ushort align1;
uint32_t align2;
uint64_t a;
};

这是“手工”的方法,其实还有更方便的,就是gcc的attribute修饰符:

struct page __attribute__ ((__packed__))
{
ushort c;
uint64_t a;
};

这样不管实在32位还是64位机器上,struct page的大小都是10个字节。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值