2 空间配置器

2 空间配置器

2.2 具备次配置力的SGI空间配置器

SGI STL缺省使用alloc为配置器,而不是采用标准写法allocator<int>,前者效率更高。

1、构造和析构基本工具:constuct()和destroy()——<stl_construct.h>(内部包含头文件<new>,用于placement new)

constuct()接受一个指针p和一个初值value,将初值设定到指针所指的空间上。

template <class T1, class T2>
inline void construct(T1* p, const T2& value) {
	new (p) T1(value);// placement new; 喚起T1::T1(value);
}


 

destroy()有两个版本,第一个版本接受一个指针;第二个版本接受first和last两个迭代器,它首先利用value_type()获得迭代器所指对象的型别,再利用__type_traits<T>判断该型别的析构函数是否无关痛痒,若是(__true_type),则什么也不做,若不是(__false_type),才以循环方式就每一个对象调用第一个版本的destroy ()。

 

2、空间的配置与释放,std::alloc——<stl_alloc.h>

设计哲学:向system heap要求空间,考虑多线程状态,考虑内存不足时的应变措施,考虑过多“小型区块”可能造成内存碎片(使用双层级配置器)。

# ifdef __USE_MALLOC
typedef __malloc_alloc_template<0> malloc_alloc;
typedef malloc_alloc alloc; // 令alloc 為第㆒級配置器
# else
// 令alloc 為第㆓級配置器
typedef __default_alloc_template<__NODE_ALLOCATOR_THREADS, 0> alloc;
#endif /* ! __USE_MALLOC */


5、第一级配置器__malloc_alloc_template剖析

 SGI以malloc而非::operator new来配置内存,因此SGI不能直接使用C++的set_new_handler(),必须使用一个类似功能的set_malloc_handler()。

 

 6、第二级配置器__default_alloc_template剖析

//free-list的节点结构如下:
union obj{
union obj* free_list_link;
char client_data[1]; //The client sees this.
}

//16个free-list,各自管理大小为8、16、24、...、128 bytes的小额区块。
static obj* volatile free_list[16];


 7、配置器类__default_alloc_template中的成员函数allocate():判断块大小,大于128字节则调用第一级配置器;小于128字节则检查对应的free-list,如果没有可用区块,则调用成员函数refill()为free-list填充空间。refill()调用chunk_alloc()从内存池中取得空间,之后链入对应的free-list。chunk_alloc()负责从内存池中取得空间,并在内存不足时,补充内存池。(补充内存池即调用malloc()分配一大段内存,如果malloc失败(不会抛出异常,返回NULL),则调用第一级配置器的成员函数allocate()(注意该函数有malloc_handler,并在内存仍然不足时可能抛出异常)。)

 

8、配置器类__default_alloc_template中的成员函数deallocate():空间释放函数。

 

2.3 内存基本处理工具

如果要使用本节的三个低层次函数,应该包含<memory>,不过SGI吧它们实际定义于<stl_uninitialized>中。

1、uninitiated_copy

template <class InputIterator, class ForwardIterator>
ForwordIterator
ininitialized_copy(InputIterator first, InputIterator last, ForwordIterator result);


注意:其中使用了value_type()、__type_traits、__true_type、__false_type、is_POD_type等实现技术。

2、uninitialized_fill(first, last, const T& x)

3、uninitialized_fill_n(first, Size n, const T& x)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值