STL C++中的内存分配

Memory Allocation in STL C++

本文关键字:内存 分配 C++ STL      更新时间:2023-10-16

我对STL C++中的内存重新分配有点困惑。例如,我知道如果我声明一个vector,并不断将元素推回其中,那么向量在某个时候需要重新分配内存空间,并将所有现有元素复制到其中。对于链表,不需要重新分配,因为元素不是连续存储在堆栈中的,每个元素都使用指针指向下一个元素。

我的问题是,C++中其他STL的情况如何?例如,stringmapunordered_map?他们需要重新分配吗?

(免责声明:此处指定的所有具体数据结构可能不是标准所要求的,但记住它们有助于将规则与具体内容联系起来)

std::string~=std::vector;它是一个动态数组,如果你一直在它的末尾推送元素,在某个时候它会重新分配你的元素。

std::list:每个元素都是一个新的链表节点,因此无论您在哪里插入新元素,都不会发生重新分配。

std::deque:它通常由几页元素组成;当页面已满时,分配一个新页面并将其添加到页面列表中;出于这个原因,你的元素永远不会重新分配,如果你在开始或结束时一直在推东西,你的元件也永远不会移动。

std::map/std::multimap/std::set/std::multiset:通常是一个二叉树,每个元素都有自己的分配;从未执行过重新分配。

std::unordered_map/std::unordered_multimap/std::unordered_set/std::unordered_multiset:哈希表;当表足够满时,将进行重新哈希和重新分配。

几乎所有STL容器的内存都分配在堆上,即使是向量。纯数组和std::数组模板可能是唯一一个在堆栈上有内存的模板。

如果您的问题是关于连续内存分配(无论是在堆栈上还是堆上),那么,很可能,普通数组、std::array、std::vector都有连续内存。几乎所有其他容器,如list、deque、map、set等,都没有连续分配内存。