Пакет pragma (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,

Другие вопросы по тегам