STL源码:空间配置器(二)构造和析构construct()/destroy()

    #ifndef __SGI_STL_INTERNAL_CONSTRUCT_H  
    #define __SGI_STL_INTERNAL_CONSTRUCT_H  
      
    // 欲使用 placement new,需先包含此文件  
    #include <new.h>  
      
    __STL_BEGIN_NAMESPACE  
      
    // 以下是 destroy() 第一版本,接受一个指针,仅仅调用析构函数 
    template <class T>  
    inline void destroy(T* pointer) {  
        // 调用 dtor ~T()  
        pointer->~T();  
    }  
      
    template <class T1, class T2>  
    inline void construct(T1* p, const T2& value) {  
        // placement new;调用 T1::T1(value)  
        new (p) T1(value);  
    }  
      
    // 如果元素的数值型别(value type)有 non-trivial destructor  
    template <class ForwardIterator>  
    inline void  
    __destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) {  
      for ( ; first < last; ++first)  
        destroy(&*first);  
    }  
      
    // 如果元素的数值型别(value type)有 trivial destructor  
    template <class ForwardIterator>   
    inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {}  
      
    // 判断元素的数值型别(value type)是否有 trivial destructor  
    template <class ForwardIterator, class T>  
    inline void __destroy(ForwardIterator first, ForwardIterator last, T*) {  
      typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;  
      __destroy_aux(first, last, trivial_destructor());  
    }  
      
    // 以下是 destroy() 第二版本,接受两个迭代器。此函数设法找出元素的数值型别,  
    // 进而利用 __type_traits<> 求取最适当措施  
    template <class ForwardIterator>  
    inline void destroy(ForwardIterator first, ForwardIterator last) {  
      __destroy(first, last, value_type(first));  
    }  
      
    // 以下是 destroy() 第二版本针对迭代器为 char * 和 wchar_t * 的特化版  
    inline void destroy(char*, char*) {}  
    inline void destroy(wchar_t*, wchar_t*) {}  
      
    __STL_END_NAMESPACE  
      
    #endif /* __SGI_STL_INTERNAL_CONSTRUCT_H */  

          这两个作为构造、析构之用的函数被设计为全局函数

         上述 construct() 接受一个指针 p 和一个初值 value ,该函数的用途就是将初值设定到指针所指的空间上。C++ 的placement new 运算符可用来完成这一任务。

         destroy() 有两个版本

         第一个版本接受一个指针,准备将该指针所指之物析构掉。这很简单,直接调用该对象的析构函数即可。.

         第二版本接受 first 和 last 两个迭代器,准备将 [first, last) 范围内的所有对象析构掉。 第二个版本 destroy() 中,首先利用 value_type() 获得迭代器所指对象的型别,在利用 __type_traits<T> 判断该型别的析构函数是否无关痛痒(我们不知道析构的范围有多大,万一很大,而每个对象的析构函数无关痛痒,那么一次次调用这些无关痛痒的析构函数,对效率是一种伤害)。若是(__true_type) ,则什么也不做就结束;若否(__false_type),这才以循环方式巡访整个范围,并在循环中每经历一个对象就调用第一个版本的 destroy()。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值