【问题标题】:Size of struct that contains two pointers包含两个指针的结构的大小
【发布时间】:2014-10-26 00:28:08
【问题描述】:

这个结构的大小是多少? (32位系统计算。不是64位。)

struct list_element
{
  short data;
  struct list_element* next;
  struct list_element* prev;
};

我试过用这些公式计算尺寸:

  1. (sizeof(list_element*) + sizeof(short)) + ((sizeof(list_element*) * 2)

    • (4 + 2) + (4 * 2) = 6 + 8 = 14
  2. (sizeof(short)) + (sizeof(list_element*) * 2)

    • 2 + (4 * 2) = 2 + 8 = 10
  3. (sizeof(list_element*) + sizeof(list_element*) + sizeof(short)) + (sizeof(list_element*) * 2)

    • (4 + 4 + 2) + (4 * 2) = 10 + 8 = 18
  4. (sizeof(list_element*) + sizeof(list_element*) + sizeof(short))

    • (4 + 4 + 2) = 10

但是,他们没有返回正确的答案。你用什么公式来计算这个结构的大小?

更新:

我的老师说我们忽略了数据对齐...希望这不会让任何人失望,因为您习惯于处理代码和结构的数据对齐...

更新 2 感谢您的帮助和数据对齐的介绍。

答案是 10 没有数据对齐...不知道为什么我这么急于使用 C 语言进行数据对齐...有趣吗?

此外,数据对齐的答案是 12。正如你们所解释的,您必须对短整数进行数据对齐以匹配整数。因此,您有 (2 + (2 个额外字节)) + 4 + 4 = 12。

【问题讨论】:

  • sizeof(struct list_element)
  • (short with padding) + (struct list_element*)*2
  • 没有公式可以给你正确的答案。你的 C 编译器可以决定使用尽可能多的额外填充字节,就像编写它的程序员感觉浪费一样!
  • 那么“测验”就是垃圾,因为这是一个没有正确答案总是正确的问题。每个编译器都使它不同。我敢打赌,编写该测验的人只是检查了他自己的编译器上的内容。现在你比他聪明。删除测验。

标签: c struct size


【解决方案1】:

结构体的大小由下式给出:

size_t size = sizeof(struct list_element);

你有两个指向结构的成员的事实只是意味着 您正在添加指针的大小,两次。在 32 位构建中,sizeof 将解析为每个指针额外 4 个字节,在 64 位构建中,它将导致每个指针额外增加 8 个字节。

需要注意的另一件事是,结构的大小可能不仅仅是单个成员的 sizeof 的总和,因为结构中的存储通常是为了对齐目的而填充的。因此,在您的 short 和下一个成员之间,填充将导致额外的大小。

我使用可能这个词的原因是,如果您的源代码中使用了 pragma pack 指令,则打包对齐可能是改变,导致 sizeof 的值不同。

关于结构对齐填充的两个很好的讨论:A general discussion here和 How to reduce memory footprint here。第二个链接特别有趣,因为它涉及结构对齐、填充和位字段,以及它们如何影响内存使用。

【讨论】:

  • 所以这意味着即使short在指针之前你也必须填充?我在互联网上看到的大多数示例都表明,如果较小的数据成员在较大的数据成员之后,您只会计算填充。
  • 我会试试这个。我可能在看 (4 + (4 *2)) = 12。
  • @rykker 感谢您的解释!当我必须再次处理数据对齐时,我会再次参考这个。
  • @ProgrammerMJM - 我已经编辑了我的帖子,其中包含两个关于填充如何工作的非常好的讨论。但是关于您的问题:这意味着您必须进行填充,即使......处理器架构需要填充,而不是语言。您无需为填充发生任何事情,它会自动发生。
  • 您可能指的是描述位域使用的部分(我不确定)请记住,int 将始终包含 sizeof int 字节(而不是位)。在这里回答您的问题的最佳方法是尝试该链接中的一些有趣示例,自己编译并调整它们的大小以查看结果。
【解决方案2】:

虽然您的老师要求忽略数据对齐,但假设 short 为 2 个字节,该结构的大小为 10 个字节。但实际上 short 的大小不是固定的,但至少 2 个字节!

看看here。您是否正确报告了老师的问题?

【讨论】:

  • 是的。她回信给我们,我们暂时忽略了数据对齐。我只是跳到假设数据对齐的结论。
【解决方案3】:

这将返回结构的大小:

sizeof(struct list_element);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2018-05-30
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多