结构的内存大小不同?

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

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

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

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

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