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个字节。
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个字节。
相关文章
- [compiler] gcc下的errno冲突 - 01 21, 2010
- “我能见一下为我做这份晚餐的厨师吗?” - 01 08, 2010
- 小心修复gcc的warning - 12 17, 2009
留言: