The OpenNET Project / Index page

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

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

"корректное наложение структуры на массив" 
Сообщение от Валерий Искать по авторуВ закладки(??) on 05-Окт-05, 12:41  (MSK)
Возникла одна трабла по С. В UNIX я слабак, раньше программил под Вындовс. Может быть кто то сталкивался с этой проблемой. Мне нужно считать массив char в структуру. Делаю примерно так.

char arr[100];
struct mystruct
{
  char a, int b;
};

struct mystruct *st = (struct mystruct *)arr;

теперь &(st->a) будет = &arr[0], а &(st->b) = &arr[4]
а нужно что бы &(st->b) ссылался на &arr[1].

Как это сделать? Я знаю что в масдаях есть директива компилятора, которая выравнивает структуры по байтам. Как это сделать в gcc? Есть ли такая директива компилятора? Или может быть кто то знает другой эффективный способ корректного наложения структуры на массив?

Заранее благодарен за ответы.

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

 Оглавление

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

1. "корректное наложение структуры на массив" 
Сообщение от Av Искать по авторуВ закладки(??) on 05-Окт-05, 14:00  (MSK)
#pragma pack(N), в твоем случае N=1 :)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "корректное наложение структуры на массив" 
Сообщение от Валерий Искать по авторуВ закладки(??) on 05-Окт-05, 14:48  (MSK)
>#pragma pack(N), в твоем случае N=1 :)

Ага, спасибо. Я уже так и сделал и все заработало. Скажите, а на сколько в этом случае упадет производительность? Если я скомпилирую gcc -с -o myfile.o mysile.c, повлияет ли эта дирректива на всю программу или только на объектный файл myfile.o?

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

4. "корректное наложение структуры на массив" 
Сообщение от sandy emailИскать по авторуВ закладки(??) on 05-Окт-05, 15:34  (MSK)
>>#pragma pack(N), в твоем случае N=1 :)
>
>Ага, спасибо. Я уже так и сделал и все заработало. Скажите, а
>на сколько в этом случае упадет производительность? Если я скомпилирую gcc
>-с -o myfile.o mysile.c, повлияет ли эта дирректива на всю программу
>или только на объектный файл myfile.o?

Я бы компилировал с использованием оптимизатора:
-с -O -o myfile.o mysile.c


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

5. "корректное наложение структуры на массив" 
Сообщение от Av Искать по авторуВ закладки(??) on 05-Окт-05, 19:03  (MSK)
>на сколько в этом случае упадет производительность?

операция выборки выравненый ячеек в памяти насколько я помню быстрее, но это разница на современных потомках 8080 изчезающе мала :)

>Если я скомпилирую gcc -с -o myfile.o mysile.c, повлияет ли эта дирректива на всю программу  или только на объектный файл myfile.o?

#pragma pack(1)
/* выравнивание по байту */
struct ...

#pragma pack()
/* выравнивание по умолчанию :) */

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

9. "корректное наложение структуры на массив" 
Сообщение от Hordi emailИскать по авторуВ закладки on 13-Окт-05, 13:12  (MSK)
Вспоминая содержимое книги Криса Касперски "Техника оптимизации программ.Эффективное использование памяти",- потери при невыравнивании не такие уж и незначительные...
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

10. "корректное наложение структуры на массив" 
Сообщение от gyn61 Искать по авторуВ закладки(ok) on 13-Окт-05, 14:49  (MSK)
А можно и так:

#pragma pack(push, 1)
/* выравнивание по байту */
struct ...

#pragma pack(pop)
/* вернули как раньше было */

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

6. "корректное наложение структуры на массив" 
Сообщение от Alexander S. Salieff emailИскать по авторуВ закладки on 06-Окт-05, 20:32  (MSK)
>>#pragma pack(N), в твоем случае N=1 :)
>
>Ага, спасибо. Я уже так и сделал и все заработало. Скажите, а
>на сколько в этом случае упадет производительность? Если я скомпилирую gcc
>-с -o myfile.o mysile.c, повлияет ли эта дирректива на всю программу
>или только на объектный файл myfile.o?

Есть такой тонкий момент, что теперь тебе (без очень тонкой настройки кода) заказана работа с нативными GCC'шными STL-контейнерами, содержащими эту структуру, т.к. у них STL'ные либы имеют предкомпиленные (и предкомпиленные безо всяких pragma pack'ов) куски, которые начинают конфликтовать с шаблонными декларациями в твоей проге, короче все кончается очень плохо, абсолютно неразгребаемыми segfault'ами. Девелоперы GCC сказали что эту багу они править не собираются, ибо "использовать в 21ом веке пакованные структуры - это дикость"...

По той же причине очень не рекоммендуется собирать STL'ный плюсовый софт с помощью g++ -fno-pack

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

2. "корректное наложение структуры на массив" 
Сообщение от А Искать по авторуВ закладки(??) on 05-Окт-05, 14:13  (MSK)

union ff {
             char* p;
             mystruct *ms;
      } myunion;

myunion.p = arr;
...

или

union ff {
             char arr[100];
             mystruct *ms;
      } myunion;

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

7. "корректное наложение структуры на массив" 
Сообщение от AlexKiriukha Искать по авторуВ закладки(ok) on 11-Окт-05, 18:55  (MSK)
IMHO это самое корректное решение

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

8. "корректное наложение структуры на массив" 
Сообщение от f00l Искать по авторуВ закладки(ok) on 12-Окт-05, 19:45  (MSK)
struct mystruct
{
  char a    __attribute__((packed));
  int b     __attribute__((packed));
};

Это просто выровнит одну структуру по размеру.
а #pragma pack(1) выровниит все программу и
уменьшив быстродействие.

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

11. "корректное наложение структуры на массив" 
Сообщение от enot Искать по авторуВ закладки(??) on 13-Окт-05, 14:51  (MSK)
> struct mystruct
>{
>  char a    __attribute__((packed));
>  int b     __attribute__((packed));
>};
>
> Это просто выровнит одну структуру по размеру.
> а #pragma pack(1) выровниит все программу и
> уменьшив быстродействие.

Неа, если писать:
#pragma pack(push,1)
struct _mystruct {
char a;
int b;
};
#pragma pack(pop)
то не все программу, а только конкретную структуру.

Если не поймет, то старая запись:
#pragma pack(1)
struct _mystruct {
char a;
int b;
};
#pragma pack()


Вообще-то правильней использовать __attribute__ так:
struct mystruct {
  char a;
  int b;
} __attribute__((packed));
При упаковке отдельных элементов результат может отличаться от упаковки  всей структуры?

Использование __attribute__ непереносимо под другие компиляторы.

А вот если забыть закрывающий pack, то первый же виртуальный класс выдаст segmentation fault. STL например ))...

Касперски конечно надо почитать... А лучше заранее подумать над алгоритмом. Тогда и оптимизировать не надо будет :)

"использовать в 21ом веке пакованные структуры - это дикость"...
использовать оператор goto тоже, вот только в некоторых случаях лучше выхода чем оператор goto или пакованные структуры еще не придумали.

union тоже выравнивается, так что тоже в pack запихивать надо :)

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


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

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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