pragma pack(1) nor __attribute__ ((aligned (1))) 是怎么执行的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (21)

我的代码过去经常正常执行,但现在结构的大小突然变成了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打包结构?

提问于
用户回答回答于

Xcode使用gccclang编译器,它们都使用__attribute__((packed))指定结构包装。

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

使用__attribute__((aligned(1)))告诉编译器在下一个字节边界上开始每个struct元素,但是没有告诉它在结束时可以放多少空间。这意味着编译器可以绕过struct最多可达多个机器字大小,以便更好地在数组中使用。__attribute__((packed))命令编译器不要使用任何填充,即使在struct

扫码关注云+社区

领取腾讯云代金券