我有一个类来表示浮点数的 3D 向量:
class Vector3D
{
public:
float x, y, z;
float * const data;
Vector3D() : x(0.0), y(0.0), z(0.0), data(&x) {}
}
我的问题是:x、y 和 z 是否将在内存中按顺序分配,以便我可以将 x 的地址分配给数据,然后使用数据上的下标运算符将向量分量作为数组访问?
例如,有时我可能想直接访问向量分量:
Vector3D vec;
vec.x = 42.0;
vec.y = 42.0;
vec.z = 42.0;
有时我可能想通过偏移量访问它们:
Vector3D vec;
for (int i = 3; i--; )
vec.data[i] = 42.0;
第二个示例是否具有与第一个示例相同的效果,或者我是否会冒覆盖 x、y 和 z 浮点数以外的内存的风险?
不,这是未定义的行为,原因有二:
- 首先是其他人提到的填充问题。
- 其次,即使内容被正确填充,使用偏移量取消引用指针也是无效的,这会使其超出其所指向的范围。编译器可以自由地假设这一点,并进行优化,如果违反它,则会导致未定义的行为。
但是,以下内容是有效的:
class Vector3D
{
public:
std::array<float,3> data;
float &x, &y, &z;
Vector3D() : data(), x(data[0]), y(data[1]), z(data[2]) { }
Vector3D& operator =(Vector3D const& rhs) { data = rhs.data; return *this; }
};
std::array
对于 C++0x 来说是新的,基本上等价于boost::array
。如果您不需要 C++0x 或 Boost,您可以使用std::vector
(并将初始化程序更改为data(3)
),虽然这是一个更重量级的解决方案,但它的大小可以从外界修改,如果是的话,那么结果将是 UB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)