C++ std::vector内存使用机制及实例中24字节占用用途咨询
#include <iostream> #include <vector> int main(int argc, char const *argv[]) { std::vector<int> a(32768, 0); std::cout << "Size " << sizeof a << "\nCapacity " << a.capacity() << "\nElements " << a.size(); return 0; }
运行输出结果:
Size 24 Capacity 32768 Elements 32768
24字节vector实例的分配与使用逻辑
你观察到的sizeof(a)=24是std::vector<int>实例本身占用的内存大小,在64位编译环境下,主流STL实现(GNU libstdc++、LLVM libc++等)的vector实例默认在栈上分配,总共包含3个8字节的指针,刚好占用24字节,三个指针的作用分别是:
- 指向堆内存中元素数组的起始位置:vector存储的所有元素都存放在这个指针指向的堆空间起始地址
- 指向已构造元素的末尾下一位位置:这个指针和起始指针的差值除以元素类型
int的大小(4字节),就是size()方法返回的已存储元素个数 - 指向堆上申请的整块元素空间的末尾下一位位置:这个指针和起始指针的差值除以
int大小,就是capacity()方法返回的当前vector可容纳元素的上限
堆内存占用对应说明
valgrind统计的132096字节堆内存,对应两部分:
- 元素数组堆空间:32768个int占32768×4=131072字节
- 剩余字节是系统内存分配器的对齐开销、分配器自身元数据占用,主流实现下24字节是vector栈实例的大小,不属于堆内存占用范畴,仅部分特殊分配器实现会把vector控制块放到堆上,这类场景下24字节才会被计入堆内存统计。
内容的提问来源于stack exchange,提问作者g0x0
相关产品推荐
相关产品推荐

