0

为什么标准允许我的编译器应用复制省略,即使它涉及可见的副作用,从而打破了 as-if 规则?

当一个人保证复制省略时,这对我来说似乎是合理的,因为复制/移动的实际功能(这将引起程序行为中的可见变化)不一定存在,但是在 C+ 之前为什么/如何+17?

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

4

2 回答 2

5

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

因此,复制构造函数有时实际上可能具有可见的副作用。严格来说,as-if 规则可能并不适用。

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

于 2018-07-11T21:36:49.277 回答
2

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

虽然复制省略不应该违反 as-if 规则(至少如果编译器知道在其分析中要忽略哪些副作用),但程序员可以自由地编写他的类型,所以无论如何它都会这样做。

最后,如果无法证明在特定情况下应用复制省略不违反 as-if-rule 可能会非常昂贵,因为创建对象的副本可能是任意涉及的,需要时间和空间。

因此,复制省略是 as-if 规则的一个例外,无论如何都被允许。

现在关于保证复制省略,必须承认规则不一定是完全显而易见的。因此,依赖它只是(?)性能所必需的,而不是正确性所必需的,至少在性能要求不是太严格的情况下,这是一件好事。

于 2018-07-11T21:47:30.800 回答