我有一个只声明相同类型字段的非虚拟final类。

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;
}
有帮助吗?

解决方案

这是安全的,但要小心 打破严格的别名!

在C++11行话中,你的结构是 标准布局, ,因此通过它是安全的 reinterpret_cast 致其首名成员:

§9.2.20类成员[类。mem]

指向标准布局结构对象的指针,使用reinterpret_cast进行适当转换,指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。

随后的浮点数在内存中是连续的,就像数组一样。


你为什么不提供一个 operator[]?

其他提示

否,它不是 - 数据成员之间可能会有填充。

一般来说,在便携式C ++中,否;因为系统(编译器,运行时等)可以自由地订购和空间struct / class成员。例如,将成员对齐CPU字边界。

如果控制用于构建项目的编译器,您可以使用侥幸脱离它。如果您使用的是VC,您需要使用#pragma pack http:// msdn.microsoft.com / en-US / Library / 2E70t5Y1.aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top