微不足道的破坏性和召唤破坏者的必要性

时间:2012-08-02 15:49:26

标签: c++ memory c++11 destructor typetraits

假设存在T类型std::is_trivially_destructable<T>::value == true,并进一步假设T是某个向量类的值类型。当向量的析构函数被调用,或者向量被赋值给另一个向量时,它必须销毁并释放其当前存储。由于T非常容易破坏,我是否有必要调用T的析构函数?

感谢您的帮助!

3 个答案:

答案 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的析构函数完成。

相关问题