Pragma pack (1) или __attribute__ ((выровненный (1))) работает
Мой код использовался для работы в прошлом, но теперь размер структуры внезапно составляет 16 байт. Это было 13 байт. Недавно я обновился с Xcode 4.2 до Xcode 4.3.1 (4E1019).
#pragma pack(1)
struct ChunkStruct {
uint32_t width;
uint32_t height;
uint8_t bit_depth;
uint8_t color_type;
uint8_t compression;
uint8_t filter;
uint8_t interlace;
};
#pragma pack()
STATIC_ASSERT(expected_13bytes, sizeof(struct ChunkStruct) == 13);
Я пробовал неуспешно использовать
#pragma pack(push, 1)
/* struct ChunkStruct { ... }; */
#pragma pack(pop)
Я также пробовал следующее, но не повезло
struct ChunkStruct {
uint32_t width;
uint32_t height;
uint8_t bit_depth;
uint8_t color_type;
uint8_t compression;
uint8_t filter;
uint8_t interlace;
} __attribute__ ((aligned (1)));
Как упаковать структуры с помощью Xcode 4.3.1?
Ответы
Ответ 1
Xcode использует компиляторы gcc
и clang
, которые используют __attribute__((packed))
для обозначения упаковки структуры.
struct foo {
uint8_t bar;
uint8_t baz;
} __attribute__((packed));
Использование __attribute__((aligned(1)))
сообщает компилятору, чтобы начать каждый элемент структуры на следующей границе байта, но не говорит, сколько места он может положить в конце. Это означает, что компилятору разрешено округлять struct
до кратного размера машинного слова для лучшего использования в массивах и тому подобное. __attribute__((packed))
сообщает компилятору, что он вообще не использует никаких дополнений, даже в конце struct
.