18

私のコードは以前は機能していましたが、構造体のサイズが突然 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 で構造体をパックするには?

4

1 に答える 1

30

Xcode は、構造体のパッキングを指定するために使用するgccおよびclangコンパイラを使用します。__attribute__((packed))

struct foo {
  uint8_t bar;
  uint8_t baz;
} __attribute__((packed));

Using__attribute__((aligned(1)))は、次のバイト境界で各構造体要素を開始するようにコンパイラーに指示しますが、最後にどれだけのスペースを配置できるかは通知しません。これはstruct、配列などでより適切に使用するために、コンパイラがマシン ワード サイズの倍数に丸めることができることを意味します。__attribute__((packed))の最後であっても、パディングをまったく使用しないようにコンパイラに指示しますstruct

于 2012-04-29T10:11:35.667 に答える