【发布时间】:2014-01-10 19:30:42
【问题描述】:
我有一个仅声明相同类型字段的非虚拟最终类。
struct Vector3 final
{
float X, Y, Z;
Vector3(float x, float y, float z) : X(x), Y(y), Z(z)
{
}
float Sum()
{
return X + Y + Z;
}
};
将指向此类实例的指针重新解释为浮点数组是否安全?
int main(int argc, const char *argv[])
{
Vector3 v(10, 20, 30);
Vector3 *pV = &v;
float *ff = reinterpret_cast<float*>(pV);
std::cout << ff[0] << std::endl << ff[1] << std::endl << ff[2] << std::endl;
char c;
std::cin >> c;
return 0;
}
【问题讨论】:
-
我不确定,因为可能会添加填充(否则我会发布答案)。如果你想要这种行为,为什么不重载
operator[]?它肯定会让您的呼叫站点更清洁。 -
@ChrisHayes 是的,这是正确的解决方案。
-
除了 9.2/14 之外还有其他内部填充的来源吗?它似乎对包含单一类型成员的标准布局类没有影响:“实现对齐要求可能会导致两个相邻的成员不会立即相互分配;管理虚拟功能的空间要求也是如此(10.3)和虚拟基类(10.1)。”我在 C++11 中找不到其他填充来源,但这也不是完全没有填充的保证。
标签: c++ arrays pointers c++11 reinterpret-cast