c++ 向量〈vector>如何< int>为内部向量分配内存?

zd287kbt  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(212)

就内存分配而言,我知道向量一般是如何工作的,但当您使用向量存储某种简单类型的向量时会发生什么。
简单的解决方案是始终使用内部向量的指针,但是声明类似“vector<vector<int>> a“的内容与声明类似“vector<vector<int>*> b“的内容有什么区别呢?
在这种情况下,它实际上是一个连续的内存块,用于内部向量,当重新分配打破了可用内存的边界时,会发生什么?所有的东西都复制到一个新的块中吗?这看起来不太可能,因为它是如此的昂贵,但是它又回到了第二段的问题。
谢谢你的时间!

2guxujil

2guxujil1#

vector<vector<int>>使用std::allocator作为外部向量和内部向量,这些都是独立的分配。
std::vector支持自定义分配器,特别是它支持std::scoped_allocator_adaptor跨嵌套级别共享分配器。因此,您可以编写一个分配器来尝试将内容保持在连续内存中。但正如您已经注意到的,您所能实现的是有限的。对于每个分配器,总是存在一个分配模式,该模式将分割分配。

nr9pn0ug

nr9pn0ug2#

vector<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略有不同。我希望这能给出一些见解。

相关问题