__mt_alloc源码分析(3)
来源:互联网 发布:亿播云盒刷机软件下载 编辑:程序博客网 时间:2024/06/13 13:47
struct __common_pool
__common_pool是__common_pool_base的基类,它作用就是定义pool_type和实现_S_get_pool函数。
382 template<template <bool> class _PoolTp, bool _Thread>
383 struct __common_pool
__common_pool的原型,模板参数_PoolTp是实际的内存池类,_Thread表示是否支持多线程。
384 {
385 typedef _PoolTp<_Thread> pool_type;
386
387 static pool_type&
388 _S_get_pool()
389 {
390 static pool_type _S_pool;
391 return _S_pool;
前面说过,common pool是一种内存池策略,即所有的对象类型使用同一个内存池,那么这个内存池就是上面的_S_pool。
392 }
393 };
写到这里,我突然很有兴趣看看per type pool的架构和实现,是否也是类似的。前面已经对比过__per_type_pool_policy和__common_pool_policy,那么我们就从__per_type_pool_base开始看起吧。
struct __per_type_pool_base和struct __per_type_pool
__per_type_pool_base的代码位于490到543之间,和__common_pool_base的代码几乎一模一样,除了名字不同和多了一个模板参数_Tp,所以我不想浪费篇幅陈列这些重复的代码。相比之下,__per_type_pool的代码就有趣得多,所以这个小节的重点是__per_type_pool。
464 template<typename _Tp, template <bool> class _PoolTp, bool _Thread>
465 struct __per_type_pool
466 {
467 typedef _Tp value_type;
468 typedef _PoolTp<_Thread> pool_type;
首先,__per_type_pool比__common_pool多了一个value_type,这是分配对象的类型。其次,__per_type_pool针对每种_Tp(也就是value_type)都会实例化成不同的类型,所以下面的静态函数_S_get_pool和返回的静态变量_S_pool对于每种_Tp都是不同的。这就实现了对_Tp类型的定制内存池。
470 static pool_type&
471 _S_get_pool()
472 {
473 // Sane defaults for the _PoolTp.
474 typedef typename pool_type::_Block_record _Block_record;
_Block_record本来应该在后面研究的,不过这里可以先介绍一下。它实际上就是一个内存块的“头信息”,典型的唯一成员就是指向下一个块的指针next。
475 const static size_t __a = (__alignof__(_Tp) >= sizeof(_Block_record)
476 ? __alignof__(_Tp) : sizeof(_Block_record));
关键字__alignof__用于查看某个类型在具体平台上的对齐字节数,它的语法和sizeof一样,详细信息可以参考http://www.delorie.com/gnu/docs/gcc/gcc_61.html。在流行的32位机器平台上,sizeof(_Block_record)值为4,__alignof__(_Tp)的值可能为1,2,4,8,__a等于较大者(4或8)。
考虑一下,每个空闲内存块由2部分组成,头信息(_Block_record)和数据(_Tp),由于在mt allocator里,头信息不能被数据覆盖(因为多线程下还要记录线程id,并且是重用了_Block_record中的next指针),所以数据区究竟在整个块的什么位置,是编译器参考了_Tp类型的对齐规则之后决定的事情,所以这段代码就是为了准确的得到这个偏移量。
478 typedef typename __pool_base::_Tune _Tune;
479 static _Tune _S_tune(__a, sizeof(_Tp) * 64,
480 sizeof(_Tp) * 2 >= __a ? sizeof(_Tp) * 2 : __a,
481 sizeof(_Tp) * size_t(_Tune::_S_chunk_size),
482 _Tune::_S_max_threads,
483 _Tune::_S_freelist_headroom,
484 getenv("GLIBCXX_FORCE_NEW") ? true : false);
__pool_base::_Tune是内存池控制参数的类型,里面包含了7个参数,通过构造函数一一赋值,每个参数的意义在前面已经做过介绍(参考mt allocator原理介绍)。静态变量_S_tune最后会根据_Tp的类型合适的初始化它的每个参数值。
485 static pool_type _S_pool(_S_tune);
用定制的控制参数_S_tune构造定制的内存池_S_pool。
486 return _S_pool;
487 }
488 };
- __mt_alloc源码分析(3)
- __mt_alloc源码分析(1)
- __mt_alloc源码分析(2)
- __mt_alloc源码分析(4)
- __mt_alloc源码分析(5)
- __mt_alloc源码分析(6)
- __mt_alloc源码分析(7)
- __mt_alloc源码分析(8)
- __mt_alloc源码分析(9)
- __mt_alloc源码分析(10)
- __mt_alloc源码分析(11)
- __mt_alloc源码分析(12)
- iptables源码分析(3)
- uboot源码分析(3)
- uboot源码分析(3)
- uboot源码分析(3)
- WeEngine源码分析(3)
- PhotoView源码分析(3)
- C2C
- ERP Enterprise Resource Planning(企业资源计划)
- B2B(Business To Business)
- 基于TMS320DM642的MPEG4编码器的设计与实现
- COMException 此事务已明地或暗地被确认或终止
- __mt_alloc源码分析(3)
- B2C(Business To Customer)
- ABAP--使用SLIN事务码进行ABAP程序扩展语法检查,提高程序开发的质量
- Java同步机制浅谈――synchronized对代码作何影响?
- 最令PHP初学者头痛的十四个问题
- java synchronized的几个规则
- 用rsync实现网站镜像和备份
- RAII:资源获取即初始化
- XML配置文件的读取处理