为什么这个结构40的大小似乎应该是12/24?

时间:2018-05-05 00:42:27

标签: c++ struct sizeof

在一个我需要处理旧代码的项目中,我有这个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);
};

2 个答案:

答案 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字节。