【问题标题】:Struct varies in memory size?结构的内存大小不同?
【发布时间】:2011-10-11 16:01:56
【问题描述】:

为什么在第一种情况下不是 12? 测试于:最新版本的 gcc 和 clang,64 位 Linux

struct desc
{
    int** parts;
    int nr;
};

sizeof(desc); Output: 16

struct desc
{
    int** parts;
};

sizeof(desc); Output: 8

struct desc
{
    int nr;
};

sizeof(desc); Output: 4

【问题讨论】:

    标签: c memory memory-management


    【解决方案1】:

    允许编译器在结构成员之间添加填充以提高处理效率。此填充因平台、编译器版本等而异。这是无法通过网络发送 structs 的原因之一。

    您可以使用offsetof 找出您的编译器添加填充的确切位置。

    【讨论】:

    • 64bit -> 8 bytes -> 将 4 bytes 改为 8 bytes -> 16
    • 使用 C 标准是不可能的; C 标准不包括 struct/pragma 包装
    【解决方案2】:

    如上一个答案所示,允许编译器添加填充。这通常是因为有时硬件要求某些数据类型必须出现在某些内存边界上。看起来您的系统希望将指针放在 8 字节边界上。

    填充位于结构的末尾,并且是必需的,这样 struct desc 数组中的每个元素仍将位于 8 字节边界上。

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多