向量<向量<int>>如何为内部向量分配内存?



就内存分配而言,我知道vector一般是如何工作的,但是当您使用vector来存储某种简单类型的vector时,会发生什么呢?

简单的解决方案是始终使用指针来表示内部向量,但是声明"vector<vector<int>> a";宣布类似";vector<vector<int>*> b"?

如果它实际上是内部向量的连续内存块,当重新分配打破了可以使用的内存边界时会发生什么?所有的东西都被复制到一个新的区块了吗?这似乎不太可能,因为它太贵了,但它又回到了第二段中的问题。

谢谢你的时间!

Avector<vector<int>>使用std::allocator作为外部和内部向量。这些都是独立的分配。

std::vector支持自定义分配器,特别是它支持std::scoped_allocator_adaptor在嵌套层之间共享一个分配器。所以你可以写一个分配器来把东西保存在连续内存中。但正如你已经提到的,你所能取得的成就是有限的。对于每个分配器,总是有一个分配模式,将片段分配。

Avector<vector<T>>不是std::vector的特例。当您使用vector<vector<T>>时,没有使用特殊的分配代码。你放入vector<vector<T>>中的每个vector<T>都自己管理它的分配。周围的向量只管理包含每个vector<int>本身的分配(但不包括它们管理的分配)。

关于你的第二个问题,vector<vector<T>>vector<vector<T>*>之间的区别(我假设这是你使用星号时所指的类型),是第二个是指针指向T向量的向量,而第一个是T向量的向量。

为了强调,内部向量管理的内存不会形成一个巨大的连续内存块。

值得指出的是,std::vector确实有一个特定类型的特例:std::vector<bool>。标准鼓励标准库实现以这样的方式编写它,当您使用std::vector<bool>时,它仅为每个bool存储1位,而不是一个完整的字节。这可以减少内存使用,但代价是运行时效率的降低,因为现在在访问该向量的元素时需要额外的指令来提取单个位。vector<bool>在模板元编程中有时也很烦人,因为它的方法实际上与普通的std::vector略有不同。我希望这能给你一些启发。

最新更新