0X00.STL中的_Construct和_Destroy
_Construct和_Destroy都是在STL标准库中的stl_construct.h头文件中定义的函数。其中源代码如下
template
inline void _Construct(_T1* __p) {
new ((void*) __p) _T1();
}template
inline void _Destroy(_Tp* __pointer) {
__pointer->~_Tp();
}
可以很明显的看出来这里显示的调用了构造函数。顺带一提,stl之所以希望将内存的分配和对象的构造(注意构造时候是不会分配内存的)分开,是为了可以用上内存池解决频繁的申请和释放小内存带来的性能损耗。
0X01我们什么情况下可以显示调用析构构造函数
在c++语法中为我们提供了一个”placement new”的语法,这个语法设计用意也是为了将内存的分配和对象的构造分开。具体语法如下
char memory[izeofFred];
void *p = memory;
Fred* f = new (p) Fred();
//to do something
f->~Fred();
使用 方法 new(void * p) T; p是那块内存区域的指针, T是对象的类型。
当我们这么做了,这块内存区域并没有被释放,但是中就有一个Fred对象被构造,析构了。这个时候我们可以把那块内存区域给另外一个对象,可以减少内存的申请和释放。在STL中对象调用这两个函数进行构造和析构的必定是用了STL内存分配器中内存池中内存,STL希望重复利用这块内存所以运用了”placement new”来避免内存的释放。
综上所诉,当我们需要将对象的构造和内存的申请分开来时,我们可以显示的调用析构和构造函数,一定要用”placement new”.
顺便一提在STL中如果这个对象是POD类型,STL的构造器会直接调用memcpy将这个对象初始化,这个比调用构造函数初始化还省时间