под структуру выделяется пямять кратная 4 байтам, нельзя ли указать кратность равную 1 байту ? и как это делается?Поясняю:
struct s_
{
unsigned int a; /* 4 байта */
unsigned short b; /* 2 байта */
};
typedef struct s_ s;sizeof(s) - 8 байт !!!
sizeof(s.a) - 4 байта
sizeof(s.b) - 2 байта
но 8 != 4+2 а мне надо что б размер структуры в целом совпадал с размером суммы всех полей.
>под структуру выделяется пямять кратная 4 байтам, нельзя ли указать кратность равную
>1 байту ? и как это делается?
>
>Поясняю:
> struct s_
>{
> unsigned int a; /* 4 байта */
> unsigned short b; /* 2 байта */
>
>};
>typedef struct s_ s;
>
>sizeof(s) -
> 8 байт !!!
>sizeof(s.a) - 4 байта
>
>sizeof(s.b) - 2 байта
>
>но 8 != 4+2 а мне надо
>что б размер структуры в целом совпадал с размером суммы всех
>полей.struct abc {
char a;
short b;
long c;
}__attribute__((packed));
printf("abc size : %d\n",sizeof(struct abc));читайте доки про gcc - там много полезного ;-)
Выравнивание на 4 байта способствует некоторому повышению быстродействия.
>Выравнивание на 4 байта способствует некоторому повышению быстродействия.А на некоторых архитектурах с неправильно выравненными величинами
нельзя выполнять арифметические действия. Вообще "ручная" упаковка
структур хороша только для системного программирования, да и то на
самом нижнем уровне.
>>под структуру выделяется пямять кратная 4 байтам, нельзя ли указать кратность равную
>>1 байту ? и как это делается?
>>
>>Поясняю:
>> struct s_
>>{
>> unsigned int a; /* 4 байта */
>> unsigned short b; /* 2 байта */
>>
>>};
>>typedef struct s_ s;
>>
>>sizeof(s) -
>> 8 байт !!!
>>sizeof(s.a) - 4 байта
>>
>>sizeof(s.b) - 2 байта
>>
>>но 8 != 4+2 а мне надо
>>что б размер структуры в целом совпадал с размером суммы всех
>>полей.
>
>struct abc {
> char a;
> short b;
> long c;
>}__attribute__((packed));
>printf("abc size : %d\n",sizeof(struct abc));
>
>читайте доки про gcc - там много полезного ;-)
Я на самом деле не советую юзать no_pack прагмы и подобные им, потому как ребята из ГЦЦ сквад прямо заявили, что "не юзать в наше время форматирование структур по границе ширины шины - это дикость, и править в нашем компилере баги, возникающие изза ноу-паков мы не собираемся". Чтобы не быть голословным, приведу простой пример - сделай (сообразно написаному выше) std::vector<struct abc> и попробуй с ним плотно поработать... Ни один GDB не разгребет тебе возникших глюков...
Правильный выход тут только один - юзать пустые паддинги для уверенности, вроде:
struct abc {
char a;
short b;
long c;
uint8 zero_padding;
};
(Это для 32-битной шины)