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.