C++中vector<bool>内存占用与Valgrind显示不符的疑问
为什么
vector<bool>的内存占用比预期小这么多? 哈哈,这个问题其实是C++标准库的一个“小陷阱”——vector<bool>根本不是你以为的“存1字节bool的容器”,它是标准库专门做的偏特化版本,用单个位来存储每个元素!
咱们来算清楚:
- 100万个元素,每个占1位的话,总位数是1000000位
- 转换成字节就是
1000000 ÷ 8 = 125000字节,差不多122KB - 再加上
vector自身的管理开销(比如存容量、大小的变量,还有内存对齐带来的一点点额外占用),最终Valgrind显示的200KB左右就完全说得通了。
而且这和你有没有加-O优化完全没关系——这是C++标准规定的vector<bool>的实现方式,属于标准库本身的特性,不管开不开编译优化,它都会用位压缩来节省内存。
要是你真的想让每个元素占1字节,直接换成vector<char>或者vector<uint8_t>就行,这时候100万个元素的内存占用就会是你最初预期的1MB左右了。
顺便说一句,你用
new vector<bool>(1000000)动态分配的方式,本质还是创建了这个位特化的容器,所以内存占用依然是压缩后的大小,不会有变化。
内容的提问来源于stack exchange,提问作者Rockybilly
相关产品推荐
相关产品推荐

