voi*_*ter 5 c++ memory destructor type-traits c++11
假设存在一个类型T
,使得std::is_trivially_destructable<T>::value == true
,并进一步假设T
是一些矢量类的值类型.当向量的析构函数被调用,或者向量被赋值给另一个向量时,它必须销毁并释放其当前存储.由于它T
是简单的可破坏的,我有必要称之为T
析构函数吗?
谢谢你的帮助!
根据C++标准(第3.8节),您可以通过取消分配或重用其存储来结束对象的生命周期.没有必要调用一个什么都不做的析构函数.另一方面,让编译器优化掉空的析构函数通常会使代码更简洁,更简单.只有当你可以节省大量的额外工作时,例如迭代集合,你才会想要特殊情况的简单析构函数.
libstdc ++(默认情况下gcc使用的标准库)恰好适用于此优化:
117 /**
118 * Destroy a range of objects. If the value_type of the object has
119 * a trivial destructor, the compiler should optimize all of this
120 * away, otherwise the objects' destructors must be invoked.
121 */
122 template<typename _ForwardIterator>
123 inline void
124 _Destroy(_ForwardIterator __first, _ForwardIterator __last)
125 {
126 typedef typename iterator_traits<_ForwardIterator>::value_type
127 _Value_type;
128 std::_Destroy_aux<__has_trivial_destructor(_Value_type)>::
129 __destroy(__first, __last);
130 }
Run Code Online (Sandbox Code Playgroud)
和专业化std::_Destroy_aux
为__has_trivial_destructor(_Value_type) == true
:
109 template<>
110 struct _Destroy_aux<true>
111 {
112 template<typename _ForwardIterator>
113 static void
114 __destroy(_ForwardIterator, _ForwardIterator) { }
115 };
Run Code Online (Sandbox Code Playgroud)
我希望其他大多数编写良好的标准库实现都能做到这一点.