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

本文探讨了STL中的内存管理机制,重点讲解了分配器(allocator)的工作原理及其对容器性能的影响。通过分析不同编译器版本下的allocator实现细节,揭示了operator new与operator delete如何被用于内存分配与释放的过程。此外,还讨论了容器之间的实现关系及分类。

第十一节 分配器

  • 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版本如下:
    h7ieTg1.png
  • BC版本:
    Xp2bdcV.png
  • Gnu 2.9版本:
    JsWCjcD.png
  • 不太理想,额外开销大,包装一层后额外开销大;
  • SGI STL不使用这个allocator
  • STL使用alloc:
    sQ5fbTq.png
  • 16条链表,每条链表下面申请空间,额外的空间是Cookie,记录内存的大小
    HtrqTkC.png
  • Gnu 4.9版下:
    - 使用的allocator,没有使用alloc;为什莫不用,不知道!
    r9ipzBy.png
  • G4.9所附的标准库中,有许多extention allocators,其中_pool_alloc就是G2.9的alloc.
    fPrNYbV.png

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

  • 依缩进的方式表示复合关系,有一个关系;比如:priority_queue里面有一个heap支撑。
  • 旁边为指针大小
    7pkhHCd.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值