我在“游戏引擎开发基础 - 01数学”中遇到了以下代码。可以访问完整的代码清单here
struct Vector3D
{
float x, y, z;
float& operator[](int i)
{
return ((&x)[i]);
}
}
任何人都可以解释[]运算符如何访问字段y和z?
我认为这种方法的工作原理是首先获取x的地址,然后进行指针运算以获得每个单独的字段。既然如此,你如何保证x,y,z在内存中是连续的?
答案 0 :(得分:1)
有人可以解释
[] operator
如何授权y
和z
字段吗?
没有。即使代码看起来有效,行为仍未定义。
您如何保证
x
,y
,z
在记忆中是连续的?
没有这样的保证:
实施对齐要求可能导致两个相邻成员不会在彼此之后立即分配
实现此类的更好方法是使用包含三个元素的数组,然后添加成员函数,返回对x
,y
和z
的引用:
struct Vector3D {
std::array<float,3> v;
float& operator[](int i) {
return v[i];
}
float& x() {
return v[0];
}
float& y() {
return v[1];
}
float& z() {
return v[2];
}
}