заполнение, наконец, член c struct - PullRequest
3 голосов
/ 29 августа 2011

Я всегда предполагаю, как они сказали здесь http://en.wikipedia.org/wiki/Data_structure_alignment, "Важно отметить, что последний член дополняется требуемым количеством байтов, поэтому общий размер структуры должен быть кратным наибольшему выравнивание любого элемента конструкции "

Так что для такой структуры ее размер должен быть 16 при 32 процессоре

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)

Ответы [ 3 ]

4 голосов
/ 29 августа 2011

Ключевая формулировка здесь:

... общий размер структуры должен быть кратным наибольшему выравниванию любого элемента структуры ...

В вашей системе значение 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)
1 голос
/ 29 августа 2011

Википедия не особенно надежный источник таких деталей.

В этом случае размер самого большого элемента в структуре образует (довольно жесткую) верхнюю границу размера, к которому структура в целом может дополниться - но реализация свободна использовать меньше заполнения, чем это, если сочтет нужным. Во многих случаях, в «N-битном» процессоре, максимальное заполнение, которое может принести пользу для конкретной структуры, будет меньше из: 1) самого большого элемента в структуре или 2) «битности» самого процессора (поэтому с 32-битным процессором вам часто не нужно / не нужно заполнять границы больше 32-битных, даже для элементов данных больше этого).

0 голосов
/ 29 августа 2011

Это потому, что в вашем случае структура выравнивается по границам слова (где слово = 4 байта).

...