我正在尝试使用OpenCL来提高我们软件的速度。我们经常使用地图,为简化起见,将地图表示为std :: vector< std :: vector>。 OpenCL API将原始的c样式指针作为参数,例如上面的情况中的int *。
我的问题:
感谢。
答案 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元素并将其包装在暴露二维索引的类中(如果您愿意)。您可以以最小的开销获得向量的所有好处,并且所有数据仍然在连续的内存中以便快速处理。