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个字节。

相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 04 16, 2009 9:12 AM.

intel编译器试用 was the previous entry in this blog.

“太阳”下山 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.