STL源码剖析第二章
2.2.3 construct()
和destroy()
construct()
使用了placement new
template<class T1,class T2>
inline void construct(T1* p,const T2& value) {
new (p) T1(value);
}
destroy()
普通版本
接受一个指针做参数
template<class T>
inline void destroy(T* pointer) {
pointer->~T();//这是显式调用析构函数?
}
第二版本
接受两个迭代器first
,last
做参数,即一个范围
template<class ForwardIterator>
inline void destroy(ForwardIterator first,ForwardIterator last) {
__destroy(first,last,value_type(first));
};
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());
};
利用了第三章中提到的__type_traits<>
获取合适的措施。
在下面可以看到,对于POD类型,则函数体为空,不采取任何措施。(可以用更底层的函数提高效率)
__destroy_aux
template<class ForwardIterator>
inline void __destroy_aux(ForwardIterator,
ForwardIterator,__true_type) {};
出于性能?直接特化了char *
和wchar_t*
版本。省去找模板?
inline void destory(char*,char*) {};
inline void destory(wchar_t*,wchar_t*) {};
2.3 内存基本处理工具
主要是运用value_type
来traits(见iterator_traits)