繁体   English   中英

向量如何<vector<int> > 为内部向量分配 memory? </vector<int>

[英]How does a vector<vector<int>> allocates memory for the inner vectors?

就 memory 分配而言,我知道向量通常是如何工作的,但是当您使用向量存储某种简单类型的向量时会发生什么。

简单的解决方案是始终对内部向量使用指针,但是声明诸如“ vector<vector<int>> a ”之类的内容与声明诸如“ vector<vector<int>*> b ”之类的内容之间有什么区别?

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

谢谢你的时间!

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

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

需要强调的是,由内部向量管理的 memory 不会形成一个巨大的连续 memory 块。

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

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

std::vector支持自定义分配器,特别是它支持std::scoped_allocator_adaptor跨嵌套级别共享分配器。 因此,您可以编写一个分配器来尝试将事物保持在连续的 memory 中。但是正如您已经指出的那样,您可以实现的目标是有限的。 对于每个分配器,总有一个分配模式会碎片化分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM