Fork me on GitHub

侯捷STL学习(五)--allocator和容器之间的实现关系

第十一节 分配器

  • STL源码学习----内存管理
  • 分配器的好坏影响到容器的性能
  • operator new()里面调用malloc
  • D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\srcvc下的源代码路径
  • 分配的内存要比申请的内存大
  • 所以VC6.0下的allocator没有优化
// newop operator new(size_t) for Microsoft C++
#include <cstdlib>
#include <new>
#include <xutility>

_C_LIB_DECL
int __cdecl _callnewh(size_t count) _THROW1(_STD bad_alloc);
_END_C_LIB_DECL

void *__CRTDECL operator new(size_t count) _THROW1(_STD bad_alloc)
	{	// try to allocate size bytes
	void *p;
	while ((p = malloc(count)) == 0)
		if (_callnewh(count) == 0)
			{	// report no memory
			_STD _Xbad_alloc();
			}
	return (p);
	}

/*
 * Copyright (c) 1992-2007 by P.J. Plauger.  ALL RIGHTS RESERVED.
 * Consult your license regarding permissions and restrictions.
 V5.03:0009 */
  • allocator主要的两个操作是:allicatedeallocate;其里面调用operator newoperator delete
  • 没必要自己手动去写int *p=allocator<int>().allocate(512,(int*)0);和allocator<int>().deallocate(p,512)。要写明释放内存的大小,所以很难用,但是容器不需要考虑这些。
  • VC版本如下:
  • BC版本:
  • Gnu 2.9版本:
  • 不太理想,额外开销大,包装一层后额外开销大;
  • SGI STL不使用这个allocator
  • STL使用alloc:
  • 16条链表,每条链表下面申请空间,额外的空间是Cookie,记录内存的大小
  • Gnu 4.9版下:
    - 使用的allocator,没有使用alloc;为什莫不用,不知道!
  • G4.9所附的标准库中,有许多extention allocators,其中_pool_alloc就是G2.9的alloc.

第十二节 容器之间的实现关系与分类

  • 依缩进的方式表示复合关系,有一个关系;比如:priority_queue里面有一个heap支撑。
  • 旁边为指针大小
posted @ 2017-06-07 23:51  ranjiewen  阅读(751)  评论(0编辑  收藏  举报