LINUX.ORG.RU

Упаковка структур


0

0

В Гугле и в Поиске ЛОРа ничего подходящего не нашлось.

Суть вопроса. Возьмём для отвлечённого примера netinet/icmp6.h и заявленную там

struct icmp6_hdr                                                                                                                                                                   
  {                                                                                                                                                                                
    uint8_t     icmp6_type;   /* type field */                                                                                                                                     
    uint8_t     icmp6_code;   /* code field */                                                                                                                                     
    uint16_t    icmp6_cksum;  /* checksum field */                                                                                                                                 
    union                                                                                                                                                                          
      {                                                                                                                                                                            
        uint32_t  icmp6_un_data32[1]; /* type-specific field */                                                                                                                    
        uint16_t  icmp6_un_data16[2]; /* type-specific field */                                                                                                                    
        uint8_t   icmp6_un_data8[4];  /* type-specific field */                                                                                                                    
      } icmp6_dataun;                                                                                                                                                              
  };
Структура, как мы видим, неупакованная.

Вопрос: можно ли (и как, если да)

1. Объявить переменную типа «упакованная struct icmp6_hdr»

2. Объявить указатель на «упакованную struct icmp6_hdr»

3. Привести указатель (void*, например) к типу «указатель на упакованную struct icmp6_hdr».

?

Вариант «заяви и пользуй свою структуру foo, которая есть копипаста от субжевой с припиской __attribute__((packed)) в конце» не предлагать. Потому что, сейчас так в общем-то и сделано:))). Просто не нравится очень такая... корявость чтоль. Хотя если нет других вариантов, то придётся оставить так.

А можно вопрос, зачем тебе её упаковывать? Для микроконтроллеров пишешь? Тогда да 16 против 7 могут сыграть.)

Существующую структуру упаковать объявлением не получится, а если с такими же полями сделаешь свою упакованную, то её не поймет АПИ рассчитывающий принять обычную структуру. Хотя я может и не понял твоей мысли, судя по третьему пункту ты не всасываешь, что такое указатель.

shelA
()
Ответ на: комментарий от shelA

>А можно вопрос, зачем тебе её упаковывать?
..и хочу ли я поговорить об этом? Нет, не хочу. Мне нужен системный программист, а не психолог.

Существующую структуру упаковать объявлением не получится

Я тоже так думаю, но надеюсь, что ошибаюсь.

судя по третьему пункту ты не всасываешь, что такое указатель

В отличие от многих «специалистов» ЛОРа от груди меня отняли много лет назад, да и гомосексуально-оральных наклонностей не имею, так что оставляю сомнительно удовольствие «всасывать» автору поста. А «приведение к указателю» меня интересует с точки зрения синтаксической конструкции. (const *char[])arg и (void (*)(void*))arg, конечно, схожи тем, что оба - указатели. Но вряд ли кто будет спорить, что сущность их раскрывается не в занимаемом размере.

farisey
() автор топика

1. Объявить переменную типа «упакованная struct icmp6_hdr»

2. Объявить указатель на «упакованную struct icmp6_hdr»

3. Привести указатель (void*, например) к типу «указатель на упакованную struct icmp6_hdr».

Ладно. Упростим и перефразиурем: Можно ли изящным (без копипасты) способом объявить свой тип «упакованная struct icmp6_hdr», что-то вроде

typedef "упакованный struct icmp6_hdr" my_foo_t;

PS. Судя по докам gcc - нет. Но не хочу разочаровываться.

farisey
() автор топика
Ответ на: комментарий от farisey

>> А можно вопрос, зачем тебе её упаковывать?

..и хочу ли я поговорить об этом? Нет, не хочу. Мне нужен системный программист, а не психолог.

Понятное дело! Но интересно же все таки!)

Существующую структуру упаковать объявлением не получится

Я тоже так думаю, но надеюсь, что ошибаюсь.

Боюсь не ошибаетесь, может сейчас придумали что в компиляторах типа на лету запаковывает/распаковывает, но вряд ли.

судя по третьему пункту ты не всасываешь, что такое указатель

Но вряд ли кто будет спорить, что сущность их раскрывается не в занимаемом размере.

Судя по этому заявлению, во всяком случае теорию вы помните!) Но тогда я не понял смысла вопроса. Указатель void* можно привести к чему угодно, хоть *****MyMegaStru. Главное что бы по этому адресу лежали корректные данные. И не надо обижаться додумывая за собеседника (и отталкиваясь при этом судя по всему от своих внутренних переживаний) и вспоминать гомосексуалистов.))) У меня даже в мыслях этого не было. Чесслово!

shelA
()
Ответ на: комментарий от shelA

>>> А можно вопрос, зачем тебе её упаковывать?
>>..и хочу ли я поговорить об этом? Нет, не хочу. Мне нужен системный программист, а не психолог.

>Понятное дело! Но интересно же все таки!)


Иногда случается, что приходящие данные именно упакованы и это никак нельзя исправить, а обрабатывать надо. Напоминаю, что пример с хидером ICMPv6 - всего лишь пример.

>>> Существующую структуру упаковать объявлением не получится

>> Я тоже так думаю, но надеюсь, что ошибаюсь.

>Боюсь не ошибаетесь, может сейчас придумали что в компиляторах типа на лету запаковывает/распаковывает, но вряд ли.


Да тут и не надо никакого «на лету». Вопрос фактически сводился «существует ли такая синтаксическая конструкция, что ...»

>>> судя по третьему пункту ты не всасываешь, что такое указатель

>> Но вряд ли кто будет спорить, что сущность их раскрывается не в занимаемом размере.

>Судя по этому заявлению, во всяком случае теорию вы помните!)


Помню, конечно. Почему нет? Хотя для столь похвальных заявлений в мой адрес слишком мало данных. Может я просто копипастнул откуда с целью надутия щёк?

>И не надо обижаться..


Даже не думал. Практика показывает, что это вредно как для морального так и для физического состояния. Просто от природы ехидный. Отвлекусь от темы: лучше злость. Она выводит ненужную энергию вовне, а обида накапливается. Причём я не интересуюсь эзотерикой, биоэнергией, чакрам и торсионными полями, просто со временем понимаешь, что обижаться - это детское и бесполезное.

>и отталкиваясь при этом судя по всему от своих внутренних переживаний)


Вы невнимательно читали мои ответы. Я уже сообщал, что в психологе не нуждаюсь.

> и вспоминать гомосексуалистов.))) У меня даже в мыслях этого не было. Чесслово!


Ну значит есть и хорошие новости! С чем вас искренне (кроме шуток) поздравляю.


Рекомендовал бы поглядеть выше на пост tailgunner'а. Кстати, одного из наиболее сильных специалистов да и просто адекватных пассажиров. Коротко, по делу, без экскурсий в подсознание и прочих неуместных вещей.

farisey
() автор топика
Ответ на: комментарий от tailgunner


Структура, как мы видим, неупакованная.

Я лично с первого взгляда этого не вижу.


fixed. Благодарю. Чуда не случилось. Коммичу как есть и закрываем тему... хотя глаза прямо режет такой вариант :(

farisey
() автор топика
Ответ на: комментарий от farisey

>>>> Существующую структуру упаковать объявлением не получится

Я тоже так думаю, но надеюсь, что ошибаюсь.

Боюсь не ошибаетесь, может сейчас придумали что в компиляторах типа на лету запаковывает/распаковывает, но вряд ли.


Да тут и не надо никакого «на лету». Вопрос фактически сводился «существует ли такая синтаксическая конструкция, что ...»


Согласен, я немного в стиле ЛОРа ответил (на ЛОРЕ советы отдельно от понтов не даются)))

Рекомендовал бы поглядеть выше на пост tailgunner'а.


И чего он вам ответил: «Я лично с первого взгляда этого не вижу.» ))) Много вы подчерпнули вселенской мудрости с этого поста?))) Ладно уж, извините я был наверно дерзок в ответе, но хоть что-то ответил ))) Да с подъ..ом но это вас заставило обдумать еще раз вопрос и вы надеюсь поняли, в чем была суть, нет? А что вам дал ответ tailgunner'а, если не влом распишите плиз?

shelA
()
Ответ на: комментарий от farisey

> глаза прямо режет такой вариант :(

Да почему? Ручное выравнивание - обычная вещь.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

>> Структура, как мы видим, неупакованная.

Я лично с первого взгляда этого не вижу.

Нельзя ли подробнее? В моем понимании «упакованность» определяется дополнительными атрибутами компилятора (например, #pragmg packed или __attribute__ ...), а выравнивание структуры это несколько иное.

cruz7 ★★
()
Ответ на: комментарий от cruz7

> В моем понимании «упакованность» определяется дополнительными атрибутами компилятора

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

выравнивание структуры это несколько иное.

О выравнивании самой структуры речь вроде не шла.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.