我也许问一个愚蠢的问题,但我查看了Wikipedia页面的RVO 这里 并且不停地想知道这种行为是否错误。我在机器中尝试了它,尽管优化了水平,但RVO还是完全启动的。如果实际上有东西怎么办 大的 发生在构造函数中?我知道不应该,但是如果呢?我不明白为什么当构造函数中有副作用时,RVO仍然会发生。

编辑: -fno-elide-constructors 似乎停止了RVO。但是问题仍然存在。

Edit2:更严重的是,有多少人知道这样的事情?它可能是标准的,但它仍然是我所看到的一个非常丑陋的功能。至少编译器应默认情况下将其禁用,并为了解此问题的人提供开关。 :)

编辑3:我仍然坚持认为这真的很糟糕。 :)。我认为我不知道直接违反语言语法的其他语言约束。其他所有内容都会抛出编译器或链接器错误吗?

有帮助吗?

解决方案

标准任务是与计划有关的操作 可观察的状态 不得优化, 除了复制构造 在某些情况下。即使您期望看到的副作用,也不得依靠复制构造函数执行(例如,控制台输出)。

其他提示

如其他答案中所述,即使是非琐碎的复制构造函数和分配运营商,也允许编译器优化。

12.8.15

当满足某些标准时,允许实施省略类对象的副本构造, 即使对象的复制构造函数和/或破坏者都有副作用. 。在这种情况下,实施将省略的副本操作的来源和目标视为指的两种不同的参考对象的方式,并且该对象的破坏发生在两个对象的后期,当时两个对象将在没有的情况下被销毁优化。在以下情况下允许这种复制操作的这种省略(可以合并以消除多个副本):

- 在具有类返回类型的函数中的返回语句中,当表达式是具有与函数返回类型的相同CV UNQUALIFIED类型的非挥发性自动对象的名称时,可以通过构造自动变量来省略复制操作对象直接进入函数的返回值

- 当未绑定到参考的临时类对象(12.2)将被复制到具有相同CV UNQUALIFIED类型的类对象时,可以通过将临时对象直接构造到省略的目标中来省略复制操作复制

定义“错误”。 C ++语言明确允许这种优化,即使可以观察到。如果程序的行为取决于特定的实现,则不幸的是您不是使用ISO C ++,而是一些方言。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top