#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_用作浮点数组或单个浮点数元素。
答案 0 :(得分:5)
未指定引用是否需要存储。在这种情况下,您的输出表明您的编译器已决定使用存储来实现引用x
,y
和z
。
答案 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)
{
}
};
应该很清楚,现在三个x
,y
和z
成员可以绑定到数组元素,也可以绑定到其他成员。
看起来你正在寻找的是
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];}
};
指针可能会占用额外的空间,不确定......
当然,您必须使用this
,x()
和y()
。
答案 4 :(得分:-1)
在C
中,您可以执行以下操作,但在C++11
中不合法。
union xyz_ {
float xyz[3];
struct { float x, y, z; };
};