URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4150
[ Назад ]

Исходное сообщение
"выделение памяти под структуру"

Отправлено Konstantin , 06-Апр-05 18:16 
под структуру выделяется пямять кратная 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      а мне надо что б размер структуры в целом совпадал с размером суммы всех полей.


Содержание

Сообщения в этом обсуждении
"выделение памяти под структуру"
Отправлено MaximKuznetsov , 06-Апр-05 18:48 
>под структуру выделяется пямять кратная 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 - там много полезного ;-)


"выделение памяти под структуру"
Отправлено dimus , 07-Апр-05 07:08 
Выравнивание на 4 байта способствует некоторому повышению быстродействия.

"выделение памяти под структуру"
Отправлено Dead Mustdie , 07-Апр-05 17:47 
>Выравнивание на 4 байта способствует некоторому повышению быстродействия.

А на некоторых архитектурах с неправильно выравненными величинами
нельзя выполнять арифметические действия. Вообще "ручная" упаковка
структур хороша только для системного программирования, да и то на
самом нижнем уровне.


"выделение памяти под структуру"
Отправлено Alexander S. Salieff , 07-Апр-05 21:59 
>>под структуру выделяется пямять кратная 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-битной шины)