std :: vector和c风格的数组

Roe*_*oel 9 c++ stl opencl

我正在尝试使用OpenCL来提高我们软件的速度.我们经常使用地图,为简化起见,将地图表示为std :: vector <std :: vector>.OpenCL API将原始的c样式指针作为参数,例如上面的情况中的int*.

我的问题:

  • 在stl中是否存在实现保证,向量内部是否在内存中连续?
  • 我可以安全地将std :: vector转换为int*并期望它能够工作吗?
  • 在向量向量的情况下,我仍然可以认为这是正确的吗?我希望矢量可以保存其他状态数据,或对齐问题,或者其他东西......
  • 解决这个问题的最佳方法是什么?编写一个自定义的2d数据结构,它包含一个内部的,连续的内存缓冲区并使用它?我必须要复制到矢量/从矢量...

谢谢.

jal*_*alf 17

在stl中是否存在实现保证,向量内部是否在内存中连续?

从C++ 03开始,是的,保证向量使用连续存储.(在C++ 98中,存在意外漏洞,因此实现可以假设使用非连续存储,但它在2003版本的标准中得到修复 - 并且没有实现实际使用非连续存储,因为它是一个可怕的想法)

我可以安全地将std :: vector转换为int*并期望它能够工作吗?

通常的方式是&v[0].(&*v.begin()可能也会工作,但我似乎记得在标准中有一些蓬松的措辞,这使得这不是100%可靠)

不,你为什么期望这样?矢量是一个类.它不是指针.它只包含一个指针.

在向量向量的情况下,我仍然可以认为这是正确的吗?我希望矢量可以保存其他状态数据,或对齐问题,或者其他东西......

无论你存储在哪里,矢量的行为都是一样的.如果你创建了一个向量向量,最后会得到一个包含指向堆分配数组的指针的对象,其中每个元素都是一个包含指向堆分配数组的指针的对象.

至于你应该怎么做,这取决于很多因素.您的总数据集有多大?您可能希望连续分配整个表.使用向量向量,每行是单独的分配.


Nav*_*een 5

  • stl 中是否有实现保证向量
    在内存中在内部是连续的

是的,它是一个动态数组。标准保证向量中的对象是连续存储的。

  • 我可以安全地将 std::vector 转换为 int* 并期望它起作用吗?

不,但您可以使用 begin() 并将其用作指针。

  • stl 中是否有实现保证向量
    在内存中在内部是连续的

不,因为向量可能包含一些内部成员变量,所以整个二维数组不会是连续的内存位置