为什么赋值成本不能保证小于构造函数-析构函数对?

Why the cost of assignment is not guaranteed to be less than a constructor-destructor pair?

提问人:Yuan Wen 提问时间:3/30/2016 最后编辑:Yuan Wen 更新时间:3/31/2016 访问量:477

问:

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

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

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

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

C++ 造函数 析构函数 赋值运算符

评论

2赞 Jonathan Wakely 3/30/2016
谁说构造函数总是需要分配内存?您如何保证更改 an 的价值的成本低于构建 ?如果你不能保证 ,你如何保证它适用于具有成员的简单类型?intintintint
1赞 dyp 3/30/2016
如果在函数中创建一个对象,返回它,然后 A) 将其分配给现有变量或 B) 从中构造一个新变量,那么 B) 可能会更快,因为返回值优化。
0赞 David Schwartz 3/30/2016
"造函数-析构函数对需要分配和释放内存“为什么这么说呢?例如,为什么 RAII 锁架需要分配任何内存?
0赞 amdn 3/30/2016
重复:stackoverflow.com/questions/6429460/...
0赞 Yuan Wen 3/31/2016
哦,我明白。但是对于需要分配内存的类,会发生什么呢@David Schwartz@JonathanWakely

答:

8赞 Jonathan Wakely 3/30/2016 #1

我想你误解了这个建议。建议是说做“建造+销毁”比做“默认建造+转让+销毁”更便宜。

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

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

这个任务当然不比建筑便宜,因为它确实是建筑+交换+破坏。

评论

0赞 Yuan Wen 3/31/2016
你能告诉我什么时候转让会比建筑破坏便宜吗?@Jonathan韦克利
1赞 Jonathan Wakely 3/31/2016
我已经举了一个例子,其中作业更昂贵。当它不做更多工作时,它会更便宜。有无数可能的例子。