为什么sizeof给出了错误的答案

时间:2016-01-09 07:03:22

标签: c++11

好吧,我遇到了一个奇怪的问题,也许有人可以解释一下。 源代码是(c ++ 11):

‪#‎include‬ <stdio.h>
struct xyz_ {
    float xyz[3];
    float &x = xyz[0];
    float &y = xyz[1];
    float &z = xyz[2];
};

int main(int argc, char *argv[])
{
    xyz_ xyz;
    xyz.x = 0;
    xyz.y = 1;
    xyz.z = 2;
    xyz.xyz[1] = 1;
    printf("as array %f %f %f\n",xyz.xyz[0],xyz.xyz[1],xyz.xyz[2]);
    printf("as elements %f %f %f\n",xyz.x,xyz.y,xyz.z);
    int sizexyz = sizeof(xyz);
    int sizefloat = sizeof(float);
    printf("float is %d big, but xyz is %d big\n",sizefloat,sizexyz);
    return 0;
}

输出是:

as array 0.000000 1.000000 2.000000
as elements 0.000000 1.000000 2.000000
float is 4 big, but xyz is 24 big

所以结构按照我的预期工作,但尺寸是应有的两倍。在结构中使用chars而不是float会在运行时产生段错误。 我想将struct xyz_用作浮点数组或单个浮点数元素。

5 个答案:

答案 0 :(得分:5)

未指定引用是否需要存储。在这种情况下,您的输出表明您的编译器已决定使用存储来实现引用xyz

答案 1 :(得分:2)

假设您添加了另一个构造函数:

struct xyz_ {
    float xyz[3];
    float &x = xyz[0];
    float &y = xyz[1];
    float &z = xyz[2];

    xyz_()
    {
    }

    xyz_(float& a, float& b, float& c)
        : x(a), y(b), z(c)
    {
    }
};

应该很清楚,现在三个xyz成员可以绑定到数组元素,也可以绑定到其他成员。

看起来你正在寻找的是

union P3d {
    float xyz[3];
    struct {
        float x, y, z;
    };
};

不幸的是,由于某些奇怪的原因(apparently mostly political),标准中不支持此功能(尽管编译器确实支持它)。

答案 2 :(得分:1)

如果xyz_的声明是这样的话会是什么大小?

struct xyz_ {
  float xyz[3];
  float *x = &xyz[0];
  float *y = &xyz[1];
  float *z = &xyz[2];
};

引用还需要它自己的空间来存储指向它的信息。

答案 3 :(得分:1)

这个怎么样:

'

不是很漂亮或优雅,但可能会减小一些尺寸,但我认为struct xyz_ { float xyz[3]; float &x() {return xyz[0];} float &y() {return xyz[1];} float &z() {return xyz[2];} }; 指针可能会占用额外的空间,不确定......

当然,您必须使用thisx()y()

答案 4 :(得分:-1)

C中,您可以执行以下操作,但在C++11中不合法。

union xyz_ {
    float xyz[3];
    struct { float x, y, z; };
};