The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"выделение памяти под структуру"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"выделение памяти под структуру" 
Сообщение от Konstantin emailИскать по авторуВ закладки(??) on 06-Апр-05, 18:16  (MSK)
под структуру выделяется пямять кратная 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      а мне надо что б размер структуры в целом совпадал с размером суммы всех полей.

  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "выделение памяти под структуру" 
Сообщение от dimus Искать по авторуВ закладки(??) on 07-Апр-05, 07:08  (MSK)
Выравнивание на 4 байта способствует некоторому повышению быстродействия.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "выделение памяти под структуру" 
Сообщение от Dead Mustdie emailИскать по авторуВ закладки on 07-Апр-05, 17:47  (MSK)
>Выравнивание на 4 байта способствует некоторому повышению быстродействия.

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "выделение памяти под структуру" 
Сообщение от Alexander S. Salieff emailИскать по авторуВ закладки on 07-Апр-05, 21:59  (MSK)
>>под структуру выделяется пямять кратная 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-битной шины)

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру