0

所以我有一个混合数据类型的结构,如下所示,我想确保 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;
};
4

2 回答 2

1

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

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

于 2013-03-15T23:58:15.743 回答
0

我可能在这里有点超出了我的舒适区,但是 malloc 似乎有一个变体,称为 memalign :

 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;

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

请记住,我在这里做一个延伸,希望其他人可以澄清并纠正我的想法。

于 2013-03-16T01:16:15.800 回答