【问题标题】:Ensure a `std::vector` won't move its pointer确保 `std::vector` 不会移动它的指针
【发布时间】:2018-04-01 03:12:25
【问题描述】:

在 C++ 中,std::vector<T> 基本上是一个指针 (T*)、一个大小对象 (int) 和一个容量对象 (int)。

在构造时,std::vector 创建一个新指针T*,随着向量的增长,std::vector 负责随着向量的增长分配所需的内存。如果向量增长到没有更多空间添加元素T,那么std::vector 将自动将指针移动到另一个位置并复制数据。

是否可以告诉向量在构造时使用什么指针并指示固定大小并在程序试图使向量大于构造时指示的大小时中止?

【问题讨论】:

  • 您可以提供自己的分配器。
  • 如果您想要具有 O(1) 随机访问但无需重新定位元素的类似矢量的东西,请查看 std::deque。 (但这是一个比指针和几个大小更复杂的数据结构。)
  • 这听起来像是一个 XY 问题——可能有更好的设计模式,具体取决于您为什么要这样做。例如。如果对象会因移动而损坏,那么它们应该有更好的或删除的移动构造函数等。
  • 我怀疑你在向量上调用.data().front() 并将原始指针缓存在某处。但是随后向量增长并且指针无效。有各种各样的方法可以解决它,但你应该详细说明你真正想要做什么......。也许有一个代码示例。
  • 我记得 EASTL 提供了一个固定大小的向量(以及其他固定大小的容器)。你可能会看那个。 github.com/electronicarts/EASTL/blob/master/include/EASTL/…

标签: c++ pointers vector memory-management


【解决方案1】:

不,std::vector 没有提供直接的方法。

std::vector 通过分配器对象分配空间。如果你愿意,编写一个最小的分配器是相当容易的,它有一个额外的调用来禁用分配,如果在分配被禁用后尝试分配,则调用中止。

【讨论】:

  • 分配器还提供了方便的max_size 函数,可以在这里利用。
猜你喜欢
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-10
  • 2021-02-17
  • 2017-11-13
  • 2016-02-12
  • 2011-03-18
相关资源
最近更新 更多