🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
STL定义了五个全局函数,作用于未初始化的空间上。 其中两个全局函数construct()和destroy()负责对象的构造和析构,它们隶属于STL标准规范。 构造对象直接使用定位new: ~~~ template <class T1, class T2> inline void construct(T1* p, const T2& value) { new (p) T1(value); // 定位new } ~~~ 析构对象分多个版本 版本1: ~~~ template <class T> inline void destroy(T* pointer) { pointer->~T(); // 直接调用析构函数 } ~~~ 版本2: ~~~ 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()); } ~~~ 再根据对象有无必要析构分别调用: ~~~ template <class ForwardIterator> inline void __destroy_aux(ForwardIterator first, ForwardIterator last, __false_type) { // non-trivial destructor for ( ; first < last; ++first) destroy(&*first); // 逐个调用析构函数 } template <class ForwardIterator> inline void __destroy_aux(ForwardIterator, ForwardIterator, __true_type) {} // trivial destructor ~~~ 另外还有两个版本2的重载版本: ~~~ // 两个重载版本,无需析构 inline void destroy(char*, char*) {} inline void destroy(wchar_t*, wchar_t*) {} ~~~ 很显然,对象为字符,则什么也不做。 另外三个全局函数: - uninitialized_copy - uninitialized_fill - uninitialized_fill_n 这三个函数都有不同的重载版本,根据元素是否为POD(传统C struct类型),执行相应的操作,或者直接memmove(),或者调用STL泛型函数,或者分别对每个元素调用构造函数。P77的图已经概括的非常好了。详情参见《“类型萃取器”__type_traits》。 参考: 《STL源码剖析》 P51、P70.