pragma pack (1) nor 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);

Я пробовал unsuccesfully используя

#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.