-3

也许我对“打包”属性的性质有误解,但我的理解是下面的结构应该打包到 16 个字节,而不是通常填充的 24 个字节。我可以验证是否正在应用打包属性(通常),因为我在同一个头文件中定义了另一个结构,该结构从 16 字节压缩到 10 字节。编译器是否有任何理由忽略该属性而不通过警告指示?

为了澄清,当我说它似乎没有打包时,我是基于 sizeof(foo) 的输出,它返回 24 而不是预期的 16。有问题的代码在一个简单/粗略的自定义内核中目前工具非常有限,所以我一直依靠通过打印到屏幕进行基本调试。

我正在使用 GCC 10.3.0(在 ubuntu 上)。

    typedef struct {
      uint16_t m1;
      uint16_t m2;
      uint8_t m3;
      uint8_t m4;
      uint16_t m5;
      uint32_t m6;
      uint32_t m7;
    }__attribute__((packed)) foo;
4

2 回答 2

0

正如 paddy 所指出的,问题是不正确的类型定义uint64_t导致每个额外的 4 个字节,而结构中的 2 个导致额外的 8 个字节。

于 2021-11-01T05:02:52.427 回答
-1

注意事项:虽然__attribute__((packed))由 GCC 定义,但这是一个实现定义的 扩展,而不是标准 C 语言的一部分。

因此,虽然这应该与 GCC(或 GCC 衍生产品)一起工作,但它不一定适用于任何其他编译器 - 因此,如果您依赖打包,您需要确保它按预期打包.

于 2021-11-01T05:25:30.310 回答