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

voi*_*ter 5 c++ memory destructor type-traits c++11

假设存在一个类型T,使得std::is_trivially_destructable<T>::value == true,并进一步假设T是一些矢量类的值类型.当向量的析构函数被调用,或者向量被赋值给另一个向量时,它必须销毁并释放其当前存储.由于它T是简单的可破坏的,我有必要称之为T析构函数吗?

谢谢你的帮助!

Ben*_*igt 8

根据C++标准(第3.8节),您可以通过取消分配或重用其存储来结束对象的生命周期.没有必要调用一个什么都不做的析构函数.另一方面,让编译器优化掉空的析构函数通常会使代码更简洁,更简单.只有当你可以节省大量的额外工作时,例如迭代集合,你才会想要特殊情况的简单析构函数.

  • @ void-pointer:启用优化是C++标准语言要求(1.10p24)的重点,即每个线程必须执行易失性或同步操作,I/O或终止.`while`循环不允许是无限的,并且因为当有一个简单的析构函数时它没有副作用,所以正式允许优化.即使编译器无法证明迭代器递减到达`f_`. (2认同)

eca*_*mur 5

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)

我希望其他大多数编写良好的标准库实现都能做到这一点.