【问题标题】:sizeof not showing the expected outputsizeof 未显示预期输出
【发布时间】:2013-01-07 19:38:15
【问题描述】:
#include <stdint.h>
#include <stdio.h>

typedef union {
    uint64_t u[2];
    struct {
        uint64_t a:30;
        uint64_t b:30;
        uint64_t c:30;
        uint64_t d:30;
        uint64_t e:8;
    }x;
} mystruct;

int main()
{
    printf("Size %d\n", sizeof(mystruct));
}

我正在尝试在 64 位机器上编译它。预期的输出是 16,但我得到了 24。 我知道这里发生了一些对齐,但我不确定为什么 struct x 正好是 16 个字节。 有人可以解释一下吗。 谢谢

【问题讨论】:

  • 您正在使用位域:K&R 第 150 页:“关于位域的几乎所有内容都取决于实现”。我个人会省略“几乎”。
  • @cdark 他们说几乎,因为其余部分未指定;)

标签: c structure sizeof bit-fields


【解决方案1】:

来自 C 标准:

(C99, 6.7.2.1p10) "[...] 如果剩余空间不足, 不适合的位域是否放入下一个单元或与相邻单元重叠是 实现定义。”

所以在您的实现中它们不会重叠:ab 成员在一个单元中,cd 在另一个单元中,e 在另一个单元中:@987654326 @。

【讨论】:

    【解决方案2】:

    对于 64 位机器,字段 ab 使用结构体中第一个 64 位值的 60 位,cd 使用结构体中下一个 64 位值的 60 位结构,然后因为 e 是 8 位,它不能放入该 64 位值剩余的 4 位中,因此需要另一个 64 位值。因此 8x3 = 24 字节。

    【讨论】:

      【解决方案3】:

      位字段的元素永远不会与两个内存“单元”重叠(在您的情况下,内存单元是 64 位元素)。

      除了位域实现依赖于编译器这一事实之外,您的位域结构实际上很有可能以以下方式存储在内存中:

      struct {
          uint64_t a:30;
          uint64_t b:30;
          uint64_t :4;
          uint64_t c:30;
          uint64_t d:30;
          uint64_t :4;
          uint64_t e:8;
          uint64_t :56;
      }x;
      

      【讨论】:

        猜你喜欢
        • 2014-09-19
        • 1970-01-01
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 2022-11-26
        • 2021-07-13
        • 1970-01-01
        相关资源
        最近更新 更多