繁体   English   中英

为什么复制省略是按条件规则的例外?

[英]Why is copy elision an exception to the as-if rule?

为什么该标准允许我的编译器即使在涉及可见副作用的情况下也可以应用复制省略,从而违反了常规规则?

当我保证复制保留时,这对我来说似乎是合理的,因为复制/移动的实际功能(将调用程序行为的可见更改)不一定存在,但是为什么/在C +之前是这样的+17?

是因为编译器通常无法检测到副作用(我不知道这是否可能)吗?

允许此优化的情况涉及临时副本。 从概念上讲,这些应该没有可见的作用,但是该语言允许类编写者将所需的任何内容放入复制构造函数中。

因此,复制构造函数有时可能实际上具有明显的副作用。 严格来说,按条件规则可能不适用。

人们认为这种优化是足够有用的,其危害也很小,值得在语言中包括在内。 考虑到此优化早于将返回值始终复制到的语义移动了。

证明事情很困难,即使它们显然是正确的(无论它们是否正确)。 使编译器能够在可接受的时间内证明事物更加困难。 然后有些副作用实际上可能并不重要 ,但是您如何通知编译器?

尽管复制删除不应违反“按原样”规则(至少如果编译器知道在其分析中忽略哪些副作用),但程序员可以自由地编写其类型,因此无论如何都可以这样做。

最后,未能证明在特定情况下应用复制删除不会违反常规规则可能会非常昂贵,因为创建对象的副本可能会任意涉及,需要时间和空间。

因此,复制删除已成为规则的例外,无论如何都允许。

现在关于保证复制删除,必须承认规则不一定完全显而易见。 因此,在性能要求不是太严格的情况下,仅对性能有必要(?)而不是对它的依赖是一件好事。

暂无
暂无

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

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