Каковы недостатки выполнения pragma pack(1) в C?

Возможный дубликат:
Есть ли производительность проблемы при использовании pragma pack(1)?

Каковы недостатки выполнения pragma pack(1) в C? Я определил некоторые данные структуры для протокола связи и хочу отключить любое выравнивание байтов, чтобы данные находились именно там, где они должны быть, и я получаю фактический размер структуры (11 байт). Каковы недостатки отключения выравнивания байтов? Это производительность?


person Boon    schedule 20.01.2013    source источник
comment
Положительным моментом является то, что вам потребуется немного меньше памяти, недостатком является то, что процессоры обычно не могут получить доступ к невыровненной памяти, а это означает, что для получения одного целочисленного поля может потребоваться 2 или более операций чтения и пара битовых сдвигов.   -  person zneak    schedule 21.01.2013
comment
@ Питер, я бы сказал, что этот вопрос шире.   -  person Boon    schedule 21.01.2013
comment
@Boon: Вот почему я еще не отметил это ... еще. :-)   -  person Peter K.    schedule 21.01.2013


Ответы (3)


Производительность будет ниже.

Вместо того, чтобы целые числа (и другие типы данных) находились на «четных» границах памяти, где к ним можно было бы легко получить доступ, они могут «растягивать» границы памяти и требовать ДВУХ выборок (циклов ЦП) для их извлечения.

person Steve Wellens    schedule 20.01.2013

Есть несколько "минусов":

  1. Это не C. Это хак, специфичный для реализации, в некоторых компиляторах C.

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

  3. Если st.foo является членом int упакованной структуры, то &st.foo вообще не является действительным int *. Передача &st.foo функции, которая принимает аргумент типа int *, может привести к сбоям или повреждению памяти, когда вызываемая функция пытается получить доступ к данным через указатель.

  4. Это бесплатно. Правильно спроектированная структура для бинарного обмена уже имеет нулевое заполнение, потому что все поля выровнены по границам, соответствующим их размеру.

person R.. GitHub STOP HELPING ICE    schedule 21.01.2013

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

Если вы будете использовать данные в структуре для значительного объема вычислений, я бы рекомендовал работать с распакованной версией в коде и конвертировать в упакованную версию при передаче. С другой стороны, если вы не выполняете много вычислений, используя значения в структуре, это преобразование будет расточительным.

person John Colanduoni    schedule 20.01.2013