C++中复制省略背后的基本原理是什么?
C++ 标准允许(要求)编译器优化对复制构造函数的调用(在某些情况下)的原因是什么,即使它可能包含可观察到的副作用?
如果我没记错的话,“好像”规则已经允许编译器优化掉不必要的代码,只要生成的程序模拟标准中定义的抽象机器的可观察行为。
制定例外规则的动机是什么?它不会在语言中造成不一致吗?方便(或必要)吗?
回答
在绝大多数情况下,返回生成的副本将是不必要的成本。其余的时间,预计复制构造函数的副作用将通过副本的破坏而消除。像std::shared_ptr这样的事情在可以从外部观察到的副本上起作用,但在破坏时将其撤消。对象的复制构造具有复制省略会遗漏的副作用是极其罕见的。避免性能下降给罕见情况带来不便是值得的。它基本上从来没有问题。