3

我总是假设,正如他们在这里所说的http://en.wikipedia.org/wiki/Data_structure_alignment,“重要的是要注意最后一个成员填充了所需的字节数,因此结构的总大小应该是任何结构成员的最大对齐的倍数"

所以对于这样的结构,它的大小在 32 处理器上应该是 16

typedef struct
{
   double   s;  /* 8 bytes */
   char     c;  /* 7 bytes padding at the end of make the total size 8*2 */
} structa_t;  

所以我对尺寸是 12 而不是 16 感到非常惊讶!这是为什么 ?有人可以对此有所了解吗?

sizeof(double) = 8
sizeof(structa_t) = 12

顺便说一句,所以系统信息

$ uname -a
Linux 2.6.18-8.el5xen #1 SMP Thu Mar 15 21:02:53 EDT 2007 i686 i686 i386 GNU/Linux
$ gcc --version
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)
4

3 回答 3

5

这里的关键措辞是:

...结构的总大小应该是任何结构成员的最大对齐的倍数...

在您的系统上, a 的对齐方式double是 4,而不是 8。

如果等待 C1x,可以使用_Alignof操作符(类似于sizeof)。在您的系统上,

sizeof(double) == 8
_Alignof(double) == 4

您可以在 C89 中以更原始的方式测试对齐方式,

#include <stdlib.h>
struct char_double { char x; double y; };
#define DOUBLE_ALIGNMENT offsetof(struct char_double, y)

或者用宏,

#define alignof(x) offsetof(struct { char a; x b; }, b)
于 2011-08-29T04:34:17.533 回答
2

Wikipedia 并不是此类详细信息的特别可靠来源。

在这种情况下,结构中最大项的大小形成了一个(相当硬的)上限,该上限是整个结构可能被填充的大小——但实现可以自由使用比它看到的更少的填充合身。在许多情况下,对于“N 位”处理器,可以为特定结构带来任何好处的最大填充将是以下两者中的较小者:1) 结构中的最大项,或 2) 处理器本身的“位数” (因此对于 32 位处理器,您经常不需要/不想填充到大于 32 位的边界,即使对于大于该值的数据项也是如此)。

于 2011-08-29T04:31:07.343 回答
0

这是因为在您的情况下,结构与字边界对齐(其中一个字 = 4 个字节)。

于 2011-08-29T04:24:34.770 回答