__attribute__ упаковано целым числом

в документации gcc они дают информацию о том, как целые числа можно выровнять. Можно ли сделать то же самое для упаковки целых чисел?

Например, допустимо ли это в системе, которая не обрабатывает автоматически неправильно выровненные данные?

typedef uint16_t __attribute__ ((packed)) packed_uint16_t;

В моей системе это дает:

align.c:7:1: предупреждение: атрибут «упакован» игнорируется [-Wattributes]

typedef uint16_t атрибут ((packed)) packed_uint16_t;

Но моя система правильно обрабатывает невыровненные байты, поэтому я думаю, что тогда она их проигнорирует!

Это продолжение этот вопрос


person vitiral    schedule 18.04.2015    source источник
comment
Я даже не знаю, что значит упаковать uintN_t!   -  person    schedule 18.04.2015


Ответы (1)


__attribute__((packed)) относится только к структурам. Он указывает, что не должно быть отступов между элементами структуры или после них. Компилятор по-прежнему предполагает, что сама структура выровнена правильно, но он может сгенерировать специальный код для доступа к не выровненным членам структуры.

Если у вас есть не выровненный указатель (я не уверен, как вы получаете такой указатель в любом случае), и вы хотите перенести его разыменование, подумайте о том, чтобы сделать что-то вроде этого:

some_type *mptr;                     /* misaligned pointer */
char *buffer = malloc(sizeof *mptr); /* get some aligned memory */
memcpy(buffer, mptr, sizeof *mptr);
some_type *aptr = (some_type*)mptr;  /* pointer to aligned data */
person fuz    schedule 18.04.2015
comment
другими словами, нет способа сделать это в одной строке. Ну блин - все равно спасибо! Кстати, я получаю смещенные данные, потому что я разрабатываю диспетчер памяти для микроконтроллеров, и я хотел бы, чтобы все это было упаковано! - person vitiral; 19.04.2015
comment
@GarrettLinux Нет! Пожалуйста, не надо. Есть причина, по которой этот материал для выравнивания существует. Просто выясните, каковы максимальные требования к выравниванию для этого контроллера, и выровняйте буферы, которые вы возвращаете, к этому. Это, вероятно, 2 или 4, поэтому вы тратите не более 3 байтов на выделение. Серьезно, это не стоит усилий, особенно если учесть, что ваш код будет значительно замедляться. - person fuz; 19.04.2015
comment
Ха-ха, хорошо, если вы настаиваете :) Я обязательно добавлю эту опцию, чтобы пользователь мог делать все, что захочет — но вы, вероятно, правы. Я предполагаю, что в действительно ограниченных системах (16 бит) выравнивание будет составлять всего 2 байта. - person vitiral; 20.04.2015
comment
Кстати, #define WORD_SIZE = sizeof(int) всегда будет работать? Если нет, есть ли стандартный кроссплатформенный способ найти это? - person vitiral; 20.04.2015
comment
@GarettLinux, что для вас означает «размер слова»? Если вы имеете в виду «требование выравнивания типа с наибольшим требованием выравнивания», то с C11 вы можете использовать _Alignof(max_align_t). Тип max_align_t определен в stddef.h. - person fuz; 20.04.2015