【问题标题】:Why the cost of assignment is not guaranteed to be less than a constructor-destructor pair?为什么分配的成本不能保证小于构造函数-析构函数对?
【发布时间】:2016-07-18 02:52:36
【问题描述】:

在 Scott Meyers 的“Effective C++”第 26 条:尽可能长时间地推迟变量定义中,赋值的成本肯定不会低于构造函数-析构函数对。

那么,对于不同的数据类型或类,我如何比较赋值与构造函数-析构函数对的成本?哪一个会更便宜,为什么?

在我看来,构造函数-析构函数对需要分配和释放内存,而构造函数至少会初始化变量。但是赋值只需要改变变量的值。

因此,我认为通常赋值的成本应该低于构造函数-析构函数对。

【问题讨论】:

  • 谁说构造函数总是需要分配内存?您如何保证更改 int 的值的成本低于构建 int 的成本?如果你不能保证对于int,你如何保证对于具有int 成员的简单类型?
  • 如果您在函数中创建一个对象,将其返回,然后 A) 将其分配给现有变量或 B) 从中构造一个新变量,那么 B) 可能会更快,因为返回值优化。
  • "构造函数-析构函数对需要分配和释放内存" 为什么这么说呢?例如,为什么RAII lock holder 需要分配任何内存?
  • 哦,我明白了。但是对于需要分配内存的类,会发生什么?@David Schwartz@JonathanWakely

标签: c++ constructor destructor assignment-operator


【解决方案1】:

我认为您误解了建议。建议是说“构造+销毁”比“默认构造+赋值+销毁”便宜。

无论如何,不​​能保证作业更便宜,这取决于课程作者。不是所有的构造函数都分配内存,也不是所有的赋值都只是“改变变量的值”,一些赋值会重新分配,或者对值执行非平凡的检查。此外,一些赋值是按照构造+销毁的方式实现的,如复制和交换习语:

T& operator=(const T& t) {
  T(t).swap(*this);
  return *this;
}

这个赋值肯定不比构造便宜,因为它是构造+交换+销毁。

【讨论】:

  • 你能告诉我什么时候分配比建造-破坏便宜吗?反之亦然?@Jonathan Wakely
  • 我已经展示了一个分配更昂贵的示例。当它不做更多工作时,它会更便宜。有无数可能的例子。
猜你喜欢
  • 2011-11-05
  • 2013-12-22
  • 2019-03-15
  • 2021-12-06
  • 2017-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
相关资源
最近更新 更多