std::vector.data()、&std::vector[0] 和 &std::vector.front() 返回错误值
std::vector.data(), &std::vector[0] and &std::vector.front() returning wrong values
我遇到了一个不知道如何解决的小问题。我正在尝试向 GPU 发送一个 std::vector<float*>
,为了做到这一点,我必须 return 数组中的元素作为值而不是指针。
这个用于测试的float
指针向量存储了2个正方形,每个正方形有4个顶点,向量中总共有8个元素:
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
循环并将元素一个一个地推送,但可能向量拥有的模型越多,与将元素传递给值相比,向量的成本就越高内存地址(如果我错了,请纠正我,也许需要相同的时间?),所以我想坚持解决这个问题。
基本问题是你有一个指针向量,不一定都指向连续的内存。所以你不能这样对待他们。
为了将您的值放入连续的浮点数组中,您需要将它们复制到连续的浮点数组中。像
std::vector<float *> allVerts;
std::vector<float> copy;
copy.clear();
for (float *p : allVerts)
copy.push_back(*p);
现在您可以使用 copy.data()
(或 ©[0]
)获取指向连续浮点值数组的指针。
我遇到了一个不知道如何解决的小问题。我正在尝试向 GPU 发送一个 std::vector<float*>
,为了做到这一点,我必须 return 数组中的元素作为值而不是指针。
这个用于测试的float
指针向量存储了2个正方形,每个正方形有4个顶点,向量中总共有8个元素:
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
循环并将元素一个一个地推送,但可能向量拥有的模型越多,与将元素传递给值相比,向量的成本就越高内存地址(如果我错了,请纠正我,也许需要相同的时间?),所以我想坚持解决这个问题。
基本问题是你有一个指针向量,不一定都指向连续的内存。所以你不能这样对待他们。
为了将您的值放入连续的浮点数组中,您需要将它们复制到连续的浮点数组中。像
std::vector<float *> allVerts;
std::vector<float> copy;
copy.clear();
for (float *p : allVerts)
copy.push_back(*p);
现在您可以使用 copy.data()
(或 ©[0]
)获取指向连续浮点值数组的指针。