跳至主要內容

SGI STL的verctor是怎么管理对象的

张威大约 2 分钟c/c++SGI STL源码

SGI STL的verctor是怎么管理对象的

![](SGI STL的verctor是怎么管理对象的.assets/image-20240429164446966.png)

SGI STL push_pack()和pop_pack()

//stl_construct.h
template <class _T1, class _T2>
inline void _Construct(_T1* __p, const _T2& __value) {
  new ((void*) __p) _T1(__value);
}

template <class _T1, class _T2>
inline void construct(_T1* __p, const _T2& __value) {
  _Construct(__p, __value);
}

//stl_vector.h
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc> 
{
	//...
    void push_back(const _Tp& __x) {
    	if (_M_finish != _M_end_of_storage) {
      	construct(_M_finish, __x);
      	++_M_finish;
    	}
    	else
      	_M_insert_aux(end(), __x);
	}

//stl_construct.h
template <class _Tp>
inline void _Destroy(_Tp* __pointer) {
  __pointer->~_Tp();
}

template <class _Tp>
inline void destroy(_Tp* __pointer) {
  _Destroy(__pointer);
}

//stl_vector.h
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc> 
{
	//...
    void pop_back() {
    	--_M_finish;
    	destroy(_M_finish);
    }
};
  • 底层定义的对象的构造和析构,由全局函数模板Construct和Destroy完成

C++ STLpush_pack()和pop_pack()

[vector迭代器的实现 | 张威的编程学习笔记 (iszhwei.github.io)](https://iszhwei.github.io/ccpp/05 运算符重载/vector迭代器的实现.html)

//容器的空间配置器
template <typename T>
struct Allocator
{
	T* allocate(size_t size)//只负责内存开辟
	{
		return (T*)malloc(sizeof(T) * size);
	}
	void deallocate(void *p)//只负责内存释放
	{
		free(p);
	}
	void construct(T *p, const T &val)//已经开辟好的内存上,负责对象构造
	{
		new (p) T(val);//定位new,指定内存上构造val,T(val)拷贝构造
	}
	void destroy(T *p)//只负责对象析构
	{
		p->~T();//~T()代表了T类型的析构函数
	}
};

template <typename T, typename Alloc = Allocator<T>>
class vector//向量容器
{
    //...
    void push_back(const T &val)//尾插
	{
		if (full())
		{
			expand();
		}
		//*_last++ = val;
		_allocator.construct(_last, val);//_last指针指向的内存构造一个值为val的对象
		_last++;
	}
	void pop_back()//尾删
	{
		if (empty()) return;
		//--_last;
		//不仅要把_last指针--,还需要析构删除的元素
		--_last;
		_allocator.destroy(_last);
	}
};
  • 底层定义的对象的构造和析构,由空间配置器完成