在一个我需要处理旧代码的项目中,我有这个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);
};
答案 0 :(得分:2)
计算机上指针/引用的大小可能是8个字节。因此,Coord对浮点数组使用12个字节,对三个引用使用24个字节,因此struct本身需要36个字节。剩下的4个字节是由于填充以对齐字边界上的指针。
如何在不产生指针成本的情况下定义等效结构?你可以使用union:
struct Coord
{
union {
float inate[3] = {0,0,0};
float x, y, z;
};
};
对于此版本的Coord,sizeof为12。
答案 1 :(得分:1)
引用是指针。根据内存模型(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字节。