如何在x32和x64中保持struct的大小不变?

时间:2013-03-15 23:38:29

标签: c memory-management padding

所以我有一个混合数据类型的结构,如下所示,我想确保sizeof(struct a)是x32和x64中字长的倍数。我怎样才能做到这一点?谢谢。

struct a {
    vaddr_t v1;
    size_t v2;
    unsigned short v3; 
    struct b* v4; 
    struct a *v5;
    int v6;
    pthread_mutex_t lock;
};

2 个答案:

答案 0 :(得分:1)

使用基本类型(如int或short),可以通过显式使用int32或int16而不是int或short来实现。对于size_t或指针等其他类型,它会变得更复杂。您最好的选择是使用类型属性(http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Type-Attributes.html)。

如果重要的是内存中的结构对齐,请对齐结构本身,而不是其成员。

答案 1 :(得分:0)

我可能会在我的舒适区之外踩一点,但似乎有一个名为memalign的malloc的变化因此:

 void *memalign(size_t alignment, size_t size);

 The memalign() function allocates size bytes on a  specified
 alignment  boundary  and  returns a pointer to the allocated
 block. The value of the returned address is guaranteed to be
 an  even  multiple of alignment. The value of alignment must
 be a power of two and must be greater than or equal  to  the
 size of a word.

在所有平台上都可能存在,也可能不存在,但这一点似乎很常见:

int posix_memalign(void **memptr, size_t alignment, size_t size); 

见:

http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_memalign.html

现在我认为固定宽度类型声明的数据类型,如ISO / JTC1 / SC22 / WG14 C,委员会修订当前ISO C标准ISO / IEC 9899:1990编程语言的工作草案所建议的 - C,(我在一个联机帮助页中看到)将是跨平台和跨架构稳定的。

因此,如果您查看结构成员的较低级别,那么希望它们基于int32_t或uint32_t之类的整数。有POSIX类型,例如:

/*
 * POSIX Extensions
 */
typedef unsigned char   uchar_t;
typedef unsigned short  ushort_t;
typedef unsigned int    uint_t;
typedef unsigned long   ulong_t;

所以我在这里想到也许只使用被定义为完全跨平台稳定数据类型的类型来构造结构,最终结果是结构总是相同的大小,无论你在何处或如何编译你的结构码。

请记住,我在这里伸展,希望别人可以澄清并纠正我的想法。