[英]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.