为什么这个结构的大小是 40,而它看起来应该是 12/24?

Why is the size of this struct 40 when it seems like it should be 12/24?

本文关键字:看起来 结构 为什么      更新时间:2023-10-16

在一个我必须处理的旧代码项目中,我有这个Coord结构。据我所知,它的大小应该是 12 字节或 24 字节。但是,sizeof(Coord返回 40。有人可以解释一下这个额外的尺寸是从哪里来的吗?

struct Coord
{
Coord();
float inate[3] = {0,0,0};
float& x = inate[0];
float& y = inate[1];
float& z = inate[2];
Coord operator*(const float&);
Coord operator=(const Coord&);
Coord operator=(const float[3]);
Coord dot(const Coord& c);
Coord cross(const Coord& c);
};

计算机上指针/引用的大小可能是 8 个字节。因此,Coord 对浮点数组使用 12 个字节,对三个引用使用 24 个字节,因此结构本身需要 36 个字节。其余 4 个字节是由于填充以对齐单词边界上的指针。

如何在不产生指针成本的情况下定义等效结构?您可以使用联合:

struct Coord
{
union {
float inate[3] = {0,0,0};
float x, y, z;
};
};

对于此版本的 Coord,sizeof 为 12。

引用是指针。根据内存型号(32 位、64 位(,基准将需要 4 个字节或 8 个字节。64 位模型将在 8 个字节边界上对齐数据,这意味着在 inate[2] 和参考 x 之间填充 4 个字节。

因此,对于 32 位,您得到 4 字节 x 3 + 4 字节 x 3 = 24 字节;在 64 位模型中,您得到 4 字节 x 3 + 4 字节用于填充 + 8 字节 x 3 = 12 + 4 + 24 = 40 字节。