STL C++中的内存分配
Memory Allocation in STL C++
我对STL C++中的内存重新分配有点困惑。例如,我知道如果我声明一个vector
,并不断将元素推回其中,那么向量在某个时候需要重新分配内存空间,并将所有现有元素复制到其中。对于链表,不需要重新分配,因为元素不是连续存储在堆栈中的,每个元素都使用指针指向下一个元素。
我的问题是,C++中其他STL的情况如何?例如,string
、map
、unordered_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等,都没有连续分配内存。
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配