繁体   English   中英

复制交换习语的有效性

[英]Validity of the copy-swap idiom

据说,在C ++数据容器中, operator =的复制交换模式的固有价值来源于

  1. 代码重用和
  2. 例外安全。

然而,复制交换习惯用于分配比其他方式需要更多的内存,因为在创建副本之前不会销毁数据,从而大大增加了异常的可能性。 鉴于情况确实如此,声称它是一种有用的模式有什么意义呢?

是否有任何其他案件中,复制操作可能会引发(复制不涉及对象)比运行内存等?

赋值运算符的复制和交换惯用语产生了强大的异常保证:构建新对象时,原始值不受影响。 当重用为分配给对象分配的内存时,通常只有在没有涉及的操作可能抛出时才能实现强异常保证。 特别是当涉及类模板时(如在std::vector<T> ),通常不保证没有任何操作抛出(当然, std::vector<T>仅在赋值时提供基本异常保证)。

通常,复制分配可以出于任何原因抛出。 最有可能的是,他们不应该因为其他原因而不是因为分配资源失败而抛出,但CopyAssignable概念中没有任何内容禁止操作抛出。

我发现复制分配没有正确实现并且例如违反基本异常保证这一点很常见。 这种情况的指标是当赋值操作符需要检查自我赋值时:如果实际需要自我赋值(而不仅仅是在那里,有时被定义为“优化”) - 人们自己做多少次 - 赋值......?),代码几乎肯定是错误的,很可能不保持基本的异常保证。 因此,我建议使用复制和交换方法,除非有一个很好的理由不尽管我知道它使用了更多的内存(尽管问题很少是没有足够的内存,至少在系统上没有我'我正在努力,但使用更多的内存可能会导致执行速度变慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM