结构的内存大小不同?

时间:2011-07-23 14:03:15

标签: c memory memory-management

为什么第一种情况下不是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

2 个答案:

答案 0 :(得分:7)

允许编译器在struct成员之间添加填充以使处理更有效。这种填充因平台,编译器版本等而异。这是使structs通过网络发送不可能的事情之一。

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

答案 1 :(得分:1)

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

填充位于结构的末尾,是必要的,因此struct desc数组中的每个元素仍然位于8字节边界上。