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

前言

image

image

昔日江湖传闻,那「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}\)

* arraybitset 通过直接把长度设置成 \(0\) 再调用 sizeof 得到内存占用

** 其实 stackqueue 本质上都是 deque


\(2025\)\(8\)\(29\) 日更新:精简了正文部分。

posted @ 2025-08-23 15:56  Jerrycyx  阅读(56)  评论(0)    收藏  举报