Chinaunix首页 | 论坛 | 博客
  • 博客访问: 259029
  • 博文数量: 21
  • 博客积分: 1263
  • 博客等级: 准尉
  • 技术积分: 697
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-24 00:05
个人简介

专注于Answers Ranking, Answer Monitor和log处理。

文章分类
文章存档

2014年(5)

2012年(16)

分类: C/C++

2012-04-10 09:13:33

STL里面真正用到的内存分配器(侯捷书说的是空间配置器)主要是,它主要用stl_construct.h里面的函数对对象进行构造和析造,并没有向内存申请新的空间,申请空间的是

stl_construct.h主要定义了construct和destory函数,construct函数负责对象的构造,destory负责对象的析构。下面是construct函数:


  1. template <class _T1, class _T2>
  2. inline void _Construct(_T1* __p, const _T2& __value) {
  3.   new ((void*) __p) _T1(__value);
  4. }

  5. template <class _T1>
  6. inline void _Construct(_T1* __p) {
  7.   new ((void*) __p) _T1();
  8. }

可以看到都是placement new方式构造对象的。一个是使用的转换构造函数(除非构造函数申明为explicit,当前内置基本类型不在此列,但int a = new int(5)也可以用,但是用的比较少而己),一个是使用的默认函数函数。

剩下的就是destory了,destory关系比较复杂。因为我们是placement new方式构造的对象,所以很多时候调用析构函数并没有什么用。先看看destory部分代码:


  1. template <class _Tp>
  2. inline void _Destroy(_Tp* __pointer) {
  3.   __pointer->~_Tp();
  4. }

  5. template <class _ForwardIterator>
  6. void
  7. __destroy_aux(_ForwardIterator __first, _ForwardIterator __last, __false_type)
  8. {
  9.   for ( ; __first != __last; ++__first)
  10.     destroy(&*__first);
  11. }

  12. template <class _ForwardIterator>
  13. inline void __destroy_aux(_ForwardIterator, _ForwardIterator, __true_type) {}

  14. template <class _ForwardIterator, class _Tp>
  15. inline void
  16. __destroy(_ForwardIterator __first, _ForwardIterator __last, _Tp*)
  17. {
  18.   typedef typename __type_traits<_Tp>::has_trivial_destructor
  19.           _Trivial_destructor;
  20.   __destroy_aux(__first, __last, _Trivial_destructor());
  21. }

  22. template <class _ForwardIterator>
  23. inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) {
  24.   __destroy(__first, __last, __VALUE_TYPE(__first));
  25. }
可以看到有两个名为__destroy_aux的函数,它们的第三个参数__false_type和__true_type都是一个空对象,它使用的是_type_traits来提取类型特性,再根据类型特性来判断应该调用哪一个版本,对于自己写的类我们也可以特化自己的_type_traits。说白了这玩意就是问“现在使用的这个类型调用它的析构函数有用么?没屁用的话就不用调用了。”因为析构函数是释放资源的,而我们构造的时候是placement new方式构造的,所以delete/free申请空间也是的事了。

然后就是特化的基本内置类型了,就是什么都不干。

  1. inline void _Destroy(char*, char*) {}
  2. inline void _Destroy(int*, int*) {}
  3. inline void _Destroy(long*, long*) {}
  4. inline void _Destroy(float*, float*) {}
  5. inline void _Destroy(double*, double*) {}
  6. #ifdef __STL_HAS_WCHAR_T
  7. inline void _Destroy(wchar_t*, wchar_t*) {}
  8. #endif /* __STL_HAS_WCHAR_T */


阅读(2639) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~