【问题标题】:Are C++ Vectors always contiguous? [duplicate]C++ 向量总是连续的吗? [复制]
【发布时间】:2011-11-28 09:06:10
【问题描述】:

可能重复:
Are std::vector elements guaranteed to be contiguous?

我遇到过一种技术,人们在 C++ 中使用向量来接收或发送 MPI 操作的数据,因为据说它可以将元素连续存储在内存中。

但是,我仍然怀疑这种方法对于任何大小的向量是否仍然稳健,尤其是当向量增长到一定大小时,这种假设可能会失效。

下面是我所说的一个例子:

MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0, 
         DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );

【问题讨论】:

  • 有什么问题?您希望我们帮助您解决的具体问题是什么?
  • ^我就是喜欢这样的回复。总是给你一种被警察审讯的感觉:P
  • 我觉得他没有阅读问题标题,而是依赖问题描述。
  • @takwing:检查史蒂夫链接到的问题的答案。简而言之,C++ 标准将向量定义为连续的。
  • @takwing: vector 不会“随机溢出元素”,但如有必要,整个事情都会重新定位。因此,这种用法是否安全取决于您所说的“增长” - 如果您的意思是将来您的程序将使用比现在更大的大小,那很好。如果你的意思是你在 MPI 持有指针时调用resize,那就不好了。

标签: c++ vector contiguous


【解决方案1】:

是的,C++ 向量总是连续的,无论大小。

但是这并不意味着当你缩小或扩大它们时它们不会在内存中移动......

【讨论】:

    【解决方案2】:

    C++ 工作草案 (www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf) 在 23.4.1 说:

    向量的元素是连续存储的,这意味着如果 v 是 一个向量,其中 T 是 bool 以外的某种类型,那么它 对所有 0

    【讨论】:

      【解决方案3】:

      基本上,是的。我知道的所有实现都是,标准要求向量具有 O[1] 查找,这基本上需要一个连续的内存块。

      标准的“您不应依赖实施细节”免责声明。

      【讨论】:

      • 它明确要求矢量使用连续布局,实际上。
      猜你喜欢
      • 2016-07-19
      • 2017-03-08
      • 2010-09-19
      • 2014-09-26
      • 2013-03-27
      • 1970-01-01
      • 2021-04-05
      • 2013-10-03
      • 2011-03-14
      相关资源
      最近更新 更多