2025.8.23 闲话:C++ 空 STL 容器的内存占用问题
前言


昔日江湖传闻,那「queue」乃暗器之王,能杀人于无形。每每在你以为大局已定之时,忽从斜刺里飞出一记冷镖,教你防不胜防,百丈之外取人性命如探囊取物。
谁料今日,某竟与那「queue」的同门「stack」狭路相逢!这厮更是个中高手,表面不动声色,内里却暗藏杀机。某本已胜券在握,正要收剑入鞘,却忽觉丹田一痛——原来那空 stack 竟也暗耗内息,如巨鲸吸水,顷刻间将某内存抽干!顿时气海崩摧,经脉尽断,百招修为化作泡影,百分功体竟归零分!
呜呼!天下阴招层出不穷,然如此杀人不见血之邪功,某今日始信矣!
正文
捏麻麻,被 \(2 \times 10^6\) 个空 stack 创死了!
众所周知,STL 的容器即使是空的,也是要占用内存的,只是没想到某些容器占用的格外的大。所以用 sizeof 获取了几种常用的空 STL 容器的大小,并且计算了一下相当于 int 的个数、\(512\) MB 内存可以开的最大数量,列成表格放在下面。
注:以下数据在换算为科学计数法时均采用向下取整而非四舍五入,因为内存占用可以比要求小但不能比要求大,不能总是想着卡满内存吧!
| STL 容器 | 占用内存 / Byte | 相当于 int 个数 |
\(512\) MB 下最大承受数量 |
|---|---|---|---|
array* |
\(1\) | \(0.25\) | \(5.3 \times 10^{8}\) |
bitset* |
\(1\) | \(0.25\) | \(5.3 \times 10^{8}\) |
forward_list |
\(8\) | \(2\) | \(6.7 \times 10^{7}\) |
vector |
\(24\) | \(6\) | \(2.2 \times 10^{7}\) |
list |
\(24\) | \(6\) | \(2.2 \times 10^{7}\) |
string |
\(32\) | \(8\) | \(1.6 \times 10^{7}\) |
priority_queue |
\(32\) | \(8\) | \(1.6 \times 10^{7}\) |
set/multiset |
\(48\) | \(12\) | \(1.1 \times 10^{7}\) |
map/multimap |
\(48\) | \(12\) | \(1.1 \times 10^{7}\) |
unordered_set/unordered_multiset |
\(56\) | \(16\) | \(9.5 \times 10^{6}\) |
unordered_map/unordered_multimap |
\(56\) | \(16\) | \(9.5 \times 10^{6}\) |
deque |
\(80\) | \(20\) | \(6.7 \times 10^{6}\) |
stack** |
\(80\) | \(20\) | \(6.7 \times 10^{6}\) |
queue** |
\(80\) | \(20\) | \(6.7 \times 10^{6}\) |
*
array和bitset通过直接把长度设置成 \(0\) 再调用sizeof得到内存占用** 其实
stack和queue本质上都是deque
\(2025\) 年 \(8\) 月 \(29\) 日更新:精简了正文部分。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19054465

浙公网安备 33010602011771号