std :: vector和c风格的数组

时间:2009-09-07 10:14:36

标签: c++ stl opencl

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

我的问题:

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

感谢。

4 个答案:

答案 0 :(得分:17)

  

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

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

  

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

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

没有。你为什么期望这个工作?矢量是一个类。它不是指针。它只是包含指针。

  

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

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

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

答案 1 :(得分:4)

  
      
  • stl中是否有实现保证,即向量是什么   内部,内存连续
  •   

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

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

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

  
      
  • stl中是否有实现保证,即向量是什么   内部,内存连续
  •   

不,因为vector可能包含一些内部成员变量,所以整个2D数组将不会是连续内存位置

答案 2 :(得分:3)

  

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

虽然我不能引用这里的标准,但我已经看到高质量库中的代码假设这种布局(即POCO)。

  

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

具体来说,你无法重铸矢量本身。但是,我看到了以下代码:

std::vector<int> vec;
int* ptr = &vec[0];
  

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

您可能无法将矢量矢量转换为线性数组。每个向量都将保留自己的内存范围,您不能指望所有这些范围都是顺序的。

答案 3 :(得分:2)

您在评论中提到您使用最多2500x2500xsizeof(双)数据。在这种情况下,我建议使用一个单一的向量而不是向量的向量。在向量中分配NxM元素并将其包装在暴露二维索引的类中(如果您愿意)。您可以以最小的开销获得向量的所有好处,并且所有数据仍然在连续的内存中以便快速处理。