假设存在T
类型std::is_trivially_destructable<T>::value == true
,并进一步假设T
是某个向量类的值类型。当向量的析构函数被调用,或者向量被赋值给另一个向量时,它必须销毁并释放其当前存储。由于T
非常容易破坏,我是否有必要调用T
的析构函数?
感谢您的帮助!
答案 0 :(得分:8)
根据C ++标准(第3.8节),您可以通过取消分配或重用其存储来结束对象的生命周期。没有必要调用一个什么都不做的析构函数。另一方面,让编译器优化掉空的析构函数通常会使代码更简洁,更简单。只有你可以节省大量的额外工作,例如迭代集合,你才会想要特殊情况的简单析构函数。
答案 1 :(得分:5)
libstdc ++(默认情况下gcc使用的标准库)适用precisely this optimisation:
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 }
std::_Destroy_aux
的{{1}}的专业化:
__has_trivial_destructor(_Value_type) == true
我希望其他大多数编写良好的标准库实现都能做到这一点。
答案 2 :(得分:1)
不,您不需要显式调用析构函数。这将由vector
的析构函数完成。