我正在尝试 OpenCL 提高我们软件的速度。我们经常使用映射,为了简化,将映射表示为 std::vector< std::vector >。OpenCL API 采用原始 C 风格指针作为参数,例如上述情况中的 int*。

我的问题:

  • stl 中是否有实现保证向量在内存中内部连续?
  • 我可以安全地将 std::vector 转换为 int* 并期望它能够工作吗?
  • 对于向量的向量,我仍然可以假设这成立吗?我希望向量能够保存其他状态数据,或者对齐问题,或者其他东西......
  • 解决这个问题的最佳方法是什么?编写一个自定义的二维数据结构来保存内部连续的内存缓冲区并使用它?我必须大量复制到向量或从向量复制......

谢谢。

有帮助吗?

解决方案

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

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

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

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

不。你为什么期望它能起作用?向量是一个类。它不是一个指针。它只是 包含 一个指针。

对于向量的向量,我仍然可以假设这成立吗?我希望向量能够保存其他状态数据,或者对齐问题,或者其他东西......

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

至于你应该如何处理这个问题,这取决于很多因素。您的总数据集有多大?您可能希望连续分配整个表。对于向量向量,每一行都是一个单独的分配。

其他提示

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

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

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

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

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

不,由于向量可能包含一些内部成员变量,整个二维数组将不是连续的内存位置

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

虽然我不能在这里引用标准,但我已经在高质量库中看到了采用这种布局的代码(即, 波科).

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

具体来说,您无法重新转换向量本身。但是,我看到了以下代码:

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

对于向量的向量,我仍然可以假设这成立吗?我希望向量能够保存其他状态数据,或者对齐问题,或者其他东西......

您可能无法将向量的向量转换为线性数组。每个向量将保留其自己的内存范围,并且您不能期望所有这些范围都是连续的。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top