就内存分配而言,我知道向量一般是如何工作的,但当您使用向量存储某种简单类型的向量时会发生什么。
简单的解决方案是始终使用内部向量的指针,但是声明类似“vector<vector<int>> a
“的内容与声明类似“vector<vector<int>*> b
“的内容有什么区别呢?
在这种情况下,它实际上是一个连续的内存块,用于内部向量,当重新分配打破了可用内存的边界时,会发生什么?所有的东西都复制到一个新的块中吗?这看起来不太可能,因为它是如此的昂贵,但是它又回到了第二段的问题。
谢谢你的时间!
2条答案
按热度按时间2guxujil1#
vector<vector<int>>
使用std::allocator
作为外部向量和内部向量,这些都是独立的分配。std::vector
支持自定义分配器,特别是它支持std::scoped_allocator_adaptor
跨嵌套级别共享分配器。因此,您可以编写一个分配器来尝试将内容保持在连续内存中。但正如您已经注意到的,您所能实现的是有限的。对于每个分配器,总是存在一个分配模式,该模式将分割分配。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
略有不同。我希望这能给出一些见解。