std::vector.data()、&std::vector[0] 和 &std::vector.front() 返回错误值

std::vector.data(), &std::vector[0] and &std::vector.front() returning wrong values

提问人:NachoBIT 提问时间:5/7/2021 最后编辑:NachoBIT 更新时间:5/7/2021 访问量:292

问:

我遇到了一个小问题,我不知道如何解决。我正在尝试向 GPU 发送 a,为此,我必须将数组中的元素作为值而不是指针返回。std::vector<float*>

这个仅用于测试的指针向量存储了 2 个正方形,每个正方形有 4 个顶点,向量中总共有 8 个元素:float

int main()
{
    //Start up code goes here

    Model m(//position, rotation, scale);
    RendererCore::AddModel(m);

    //...
}

void RendererCore::AddModel(Model& m)
{
    for (int i = 0; i < m.vertices.size(); i++)
    {
        allVerts.push_back(&m.vertices[i].position.x);
        std::cout << *allVerts.back() << std::endl;

        allVerts.push_back(&m.vertices[i].position.y);
        std::cout << *allVerts.back() << std::endl;

        allVerts.push_back(&m.vertices[i].position.z);
        std::cout << *allVerts.back() << std::endl;
    }
}

当我在那之后打印它们时,似乎一切都很好!

-1.5
0.5
1
-1.5
-0.5
1
-0.5
-0.5
1
-0.5
0.5
1
-0.5
0.5
0
-0.5
-0.5
0
0.5
-0.5
0
0.5
0.5
0

但是现在,当我尝试将它们传递给这样的值时:

float* result = *&allVerts[0];

//Print data just to test
for(int i = 0; i < allVerts.size(); i++)
{
    std::cout << result[i] << std::endl;
}

并打印“浮点数组”中的元素,它显示错误的值!

-1.5
0.5
1
1
1
1
1
1
-1.5
-0.5
1
1
1
1
1
1
-0.5
-0.5
1
1
1
1
1
1

这也发生在 和 中。*&allVerts.front()allVerts.data()

解决方法是做一个循环并逐个推送元素,但与将元素从内存地址传递给值相比,向量拥有的模型可能越多,成本就越高(如果我错了,请纠正我,也许它需要相同的时间?),所以我想坚持解决这个问题。for

C++ 指针 std

评论

1赞 Remy Lebeau 5/7/2021
请提供一个最小的可重现示例,说明您如何使用和准确打印这些值。顺便说一句,和 和 但不会编译,因为将返回 a not a .AddModel()float* result = *&allVerts[0];float* result = *&allVerts.front()float* result = allVerts[0];float* result = allVerts.data()data()float**float*
0赞 NachoBIT 5/7/2021
我现在编辑了它,我试图提供一个示例,包括我如何打印值。这样可以吗?

答:

3赞 Chris Dodd 5/7/2021 #1

基本问题是你有一个指针向量,这些指针不一定都指向连续内存。所以你不能这样对待他们。

为了将值转换为连续的浮点数组,您需要将它们复制到连续的浮点数组中。类似的东西

std::vector<float *> allVerts;
std::vector<float> copy;

copy.clear();
for (float *p : allVerts)
    copy.push_back(*p);

现在,您可以使用 (或 ) 获取指向浮点值连续数组的指针。copy.data()&copy[0]

评论

0赞 NachoBIT 5/7/2021
我以为是我做错了什么。谢谢你的解释,我很感激:D