我可以将具有 float 的 POD 数组转换为 float* 吗?

2024-01-05

考虑以下:

#include <vector>
using namespace std;

struct Vec2
{
  float m_x;
  float m_y;
};

vector<Vec2> myArray;

int main()
{
  myArray.resize(100);

  for (int i = 0; i < 100; ++i)
  {
    myArray[i].m_x = (float)(i);
    myArray[i].m_y = (float)(i);
  }

  float* raw;
  raw = reinterpret_cast<float*>(&(myArray[0]));
}

Is raw保证有 200 个具有正确值的连续浮点数?也就是说,标准能保证这一点吗?

EDIT:如果上述得到保证,并且如果Vec2有一些函数(非虚拟)和构造函数,保证仍然存在吗?

NOTE:我意识到这很危险,就我的具体情况而言,我没有 选择,因为我正在与第三方库合作。


我意识到这很危险,在我的特殊情况下,我别无选择,因为我正在与第三方库合作。

您可以添加结构大小的编译时检查:

现场演示 http://ideone.com/LZJ4cp

struct Vec2
{
    float a;
    float b;
};

int main()
{
        int assert_s[ sizeof(Vec2) == 2*sizeof(float) ? 1 : -1 ];
}

这会增加你对你的方法的信心(如上所述,由于reinterpret_cast,这仍然是不安全的)。


raw=reinterpret_cast(&(myArray[0]));

ISO C++98 9.2/17:

指向 POD 结构对象的指针,使用适当转换重新解释_cast, 指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。 [ 注意:因此,标准布局结构对象内可能存在未命名的填充,但在其开头处则不然,这是实现适当对齐所必需的。 ——尾注]


最后,相应地址的运行时检查将使这种解决方案相当安全。它可以在单元测试期间甚至在程序的每次启动时(在小型测试数组上)完成。

把它们放在一起:

现场演示 http://ideone.com/3AHK0v

#include <vector>
#include <cassert>
using namespace std;
struct Vec2
{
    float a;
    float b;
};

int main()
{
    int assert_s[ sizeof(Vec2) == 2*sizeof(float) ? 1 : -1 ];
    typedef vector<Vec2> Vector;
    Vector v(32);
    float *first=static_cast<float*>(static_cast<void*>(&v[0]));
    for(Vector::size_type i,size=v.size();i!=size;++i)
    {
        assert((first+i*2) == (&(v[i].a)));
        assert((first+i*2+1) == (&(v[i].b)));
    }
    assert(false != false);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以将具有 float 的 POD 数组转换为 float* 吗? 的相关文章

随机推荐