zoukankan      html  css  js  c++  java
  • 侯捷STL学习(五)--allocator和容器之间的实现关系

    第十一节 分配器

    • STL源码学习----内存管理
    • 分配器的好坏影响到容器的性能
    • operator new()里面调用malloc
    • D:Program Files (x86)Microsoft Visual Studio 12.0VCcrtsrcvc下的源代码路径
    • 分配的内存要比申请的内存大
    • 所以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支撑。
    • 旁边为指针大小
  • 相关阅读:
    如何使用 Python 進行字串格式化
    骨牌摆放问题 POJ 2411(状态压缩DP)
    ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
    Windows 系统如何完全卸载 VSCode
    Python 在VSCode中使用
    第十一场训练赛
    L1-046 整除光棍 (20分)
    Problem 330A
    POJ 2187 Beauty Contest (凸包 旋转卡壳)
    程序员:写作能收获什么?
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/6959711.html
Copyright © 2011-2022 走看看