vs2012 STL vector

最近项目的开发库大量使用了STL,为了确认内存已经性能问题,只能拿起代码看看。vs2012使用的STL是由Dinkumware维护的P.J. Plauger STL版本。与侯捷大作的SGI STl差距还是很大的。而且vs2010开始,该版本进行了一些c++0x的优化,据说性能有不少的提升。所以拿起代码来看看吧。

借侯捷的话说就是源码之前,了无秘密。

先看使用最多的vector吧。

初始化流程涉及2个部分,一个是容器,一个是内存分配器。

vs2012 STL vecotr

1. vector vT;
	1.1==>vecotr
	// TEMPLATE CLASS vector
	template >
		class vector
			: public _Vector_alloc::value,
				_Vec_base_types<_Ty, _Alloc> >

	typedef _Vector_alloc::value,
			_Vec_base_types<_Ty, _Alloc> > _Mybase;
		
		vector()
		: _Mybase()
		{	// construct empty vector
		}
		
		1.1.1==>xmemory0
		// TEMPLATE CLASS allocator
		template
			class allocator
				: public _Allocator_base<_Ty>
			{	// generic allocator for objects of class _Ty
			
			allocator() _THROW0()
			{	// construct default allocator (do nothing)
			}	
		
		1.1.2==>vector	
		template
		class _Vector_alloc
			: public _Vector_val
		{	// base class for vector to hold allocator with no storage
		
		 #else /* _ITERATOR_DEBUG_LEVEL == 0 */
		_Vector_alloc(const _Alloc& = _Alloc())
			{	// construct allocator from _Al
			_Alloc_proxy();
			}
		
			1.1.2.1==>vector
			// TEMPLATE CLASS _Vector_val
			template
				class _Vector_val
					: public _Container_base
				{	// base class for vector to hold data
			public:
			
				_Vector_val()
				{	// initialize values
				_Myfirst = pointer();
				_Mylast = pointer();
				_Myend = pointer();
				}
		
				1.1.2.1.1==>xutility
				struct _CRTIMP2_PURE _Container_base12
					{	// store pointer to _Container_proxy
				public:
					_Container_base12()
						: _Myproxy(0)
						{	// construct childless container
						}
					_Container_proxy *_Myproxy;
			
			1.1.3==>vector 使用分配器进行内存分配
			void _Alloc_proxy()
			{	// construct proxy from _Alval
			typename _Alloc::template rebind<_Container_proxy>::other
				_Alproxy;
			this->_Myproxy = _Alproxy.allocate(1);
			_Alproxy.construct(this->_Myproxy, _Container_proxy());
			this->_Myproxy->_Mycont = this;
			}
				
				1.1.3.1==>xmemory0
				pointer allocate(size_type _Count)
				{	// allocate array of _Count elements
				return (_Allocate(_Count, (pointer)0));
				}
				
					1.1.3.1.1==>xmemory0	直接operator new了内存。没有像SGI一样进行内存分配2级管理
					// TEMPLATE FUNCTION _Allocate
					template inline
						_Ty *_Allocate(size_t _Count, _Ty *)
						{	// allocate storage for _Count elements of type _Ty
						void *_Ptr = 0;

						if (_Count == 0)
							;
						else if (((size_t)(-1) / sizeof (_Ty) < _Count)
							|| (_Ptr = ::operator new(_Count * sizeof (_Ty))) == 0)
							_Xbad_alloc();	// report no memory

						return ((_Ty *)_Ptr);
						}
			
			1.1.4==>vector 使用分配器进行构造初始化
			void _Alloc_proxy()
			{	// construct proxy from _Alval
			typename _Alloc::template rebind<_Container_proxy>::other
				_Alproxy;
			this->_Myproxy = _Alproxy.allocate(1);
			_Alproxy.construct(this->_Myproxy, _Container_proxy());
			this->_Myproxy->_Mycont = this;
			}	
				
				1.1.4.1==>xutility
				// CLASS _Container_proxy
				struct _Container_proxy
					{	// store head of iterator chain and back pointer
					_Container_proxy()
						: _Mycont(0), _Myfirstiter(0)
						{	// construct from pointers
						}

					const _Container_base12 *_Mycont;
					_Iterator_base12 *_Myfirstiter;
					};
					
				1.1.4.2==>xmemory0 通过new(size_t, void*)实现了构造函数的调用
				void construct(_Ty *_Ptr, const _Ty& _Val)
					{	// construct object at _Ptr with value _Val
					::new ((void *)_Ptr) _Ty(_Val);
					}				

通过初始化流程我们可以知道vector实现的对象涉及以及内存分配器只是用最原始的new,delete封装而已。

你可能感兴趣的:(Windows,c++,vs2008,vs2010,STL,代码历程)