vector内存分配、内存分布
测试代码
#include <iostream>
#include <vector>
#include <unistd.h>
using namespace std;
int main()
{
int x;
vector<int> vint;
vint.push_back(5);
vint.push_back(9);
cout <<hex<<"vint: " <<&vint<<" x: "<<&x<< endl;
cout <<hex<< vint[0]<< " vint0: "<<&vint[0]<<" vint1: "<< &vint[1]<<endl;
sleep(60*3);
}
输出结果
编译
g++ -g -m32 -o vct vector.cpp
执行
[root@localhost test-vector-mem]# ./vct
vint: 0xfffe70a8 x: 0xfffe70b4
5 vint0: 0x8266018 vint1: 0x826601c
linux内存信息maps
[root@localhost 2428]# cat maps
08048000-0804b000 r-xp 00000000 fd:00 73219086 /opt/test-vector-mem/vct
0804b000-0804c000 r--p 00002000 fd:00 73219086 /opt/test-vector-mem/vct
0804c000-0804d000 rw-p 00003000 fd:00 73219086 /opt/test-vector-mem/vct
08266000-08287000 rw-p 00000000 00:00 0 [heap]
f7431000-f7434000 rw-p 00000000 00:00 0
.............................................
fffc7000-fffe8000 rw-p 00000000 00:00 0 [stack]
[root@localhost 2428]#
结果解读
-
vint: 0xfffe70a8 vector管理器(其实就是三个指针头、尾、内存尾)在本实例函数内申请存在栈上,即谁申请谁负责存
-
vector对象自身和对象内容的内存组成:引用 https://www.jianshu.com/p/9d400528a421
-
vint0: 0x8266018 vint1: 0x826601c, vector实际的内容对象列表,存在堆上,有STL调用底层封装的 空间配置器 std::alloc 来实现new和delete空间;
-
空间配置器 std::alloc 可以有效规避内存随便和效率问题;
-
普通new和delete过程:调用new分配内存,调用Foo()构造对象。Delete中也包括两个阶段,调用~Foo()析构对象,调用delete释放内存。
为了分工明确,STL 中将这两个阶段分开来操作。内存配置操作由alloc::allocate()负责,内存释放操作由alloc::deallocate()负责;对象构造操作由::construct()负责,对象析构操作由::destroy()负责。配置器定义于之中,SGI 内含 stl_alloc.h stl_construct.h 前者负责内存空间的配置与释放,后者负责对象的构造与析构。
考虑到小区块可能造成的内存破碎问题,SGI设计了双层的配置器,第一级直接使用Malloc()和free(),第二级则视情况来判断使用什么策略,当配置区块超过128KB,直接使用第一级配置器;当配置区块小于128KB,使用辅助的memory pool整理方式,而不再求助于第一级配置器。无论使用第一级还是第二级配置器,都封装成了不接收参数的alloc,然后有简单的封装成simple_alloc类。这个类使得空间配置器对外有了标准接口。
vector源码
#include<iostream>
using namespace std;
#include<memory.h>
// alloc是SGI STL的空间配置器
template <class T, class Alloc = alloc>
class vector
{
public:
// vector的嵌套类型定义,typedefs用于提供iterator_traits<I>支持
typedef T value_type;
typedef value_type* pointer;
typedef value_type* iterator;
typedef value_type& reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
protected:
// 这个提供STL标准的allocator接口
typedef simple_alloc <value_type, Alloc> data_allocator;
iterator start; // 表示目前使用空间的头
iterator finish; // 表示目前使用空间的尾
iterator end_of_storage; // 表示实际分配内存空间的尾
void insert_aux(iterator position, const T&a