【问题标题】:How to disable return value optimization in Visual Studio 2010?如何在 Visual Studio 2010 中禁用返回值优化?
【发布时间】:2012-03-30 10:13:54
【问题描述】:

是否可以在 Visual Studio 2010 中禁用 RVO(返回值优化)?将优化标志设置为/Od(关闭所有优化)没有帮助。在 g++ 中存在标志 -fno-elide-constructors 禁用 RVO。

【问题讨论】:

    标签: c++ visual-studio visual-studio-2010 return-value-optimization


    【解决方案1】:

    你不能。就是这么简单。 RVO/NRVO 是标准的,你的代码不应该依赖于它不存在。

    【讨论】:

    • 据我所知,RVO/NRVO 不是标准(参见 C++0x 标准,第 12.8 节。复制和移动类对象,第 32 段)。标准只允许这样的优化(g++ 和 VisualStudio 实现了它)。对于那件事我没有任何疑问。但是最好有一些开关来禁用它。可能出于教育目的。谢谢,现在清楚多了:)
    • 允许!= 要求。因此,它不是标准的一部分,只是不会与标准相矛盾。
    • "如果包含它不违反标准,那么它就是标准。"我认为说“那么它是标准允许的”会更准确,这并不一定意味着编译器不应该提供一个标志来关闭它。例如,我想出于教育目的将其关闭。
    • @Puppy 这里的问题 - 即问题可能在问什么,以及我找到的问题是什么 - 你不能编写假设的代码它包括在内,因为不包括它是符合标准的。因此,提供并尊重禁用它的选项的编译器在启用或不启用该选项的情况下都符合标准。如果我想编写可移植代码,我可能想在启用和不启用它的情况下测试我的代码,以确保它可以与所有符合标准的编译器一起使用。使用编译器提供的标志来禁用它是最简单的。
    • @JamieS 这是唯一真正有意义的动机。我可能会评论说,通过测试来做到这一点很棘手,因为编译器实现 RVO 和朋友的确切情况可能在编译器或版本之间有所不同,所以最好的选择是简单地不编写具有不纯复制/移动构造函数的对象。话虽如此,您可能有遗留代码等无法正确执行此操作。
    【解决方案2】:

    尝试将您的变量定义为volatile,也许可以解决您的问题。如果没有,您应该发送代码...

    【讨论】:

    • +1;尽管这只是一个随机猜测(因此值得反对),但return my_volatile_variable; 确实禁用了 RVO 是正确的。 (C++11 §12.8/31 第 1 项。)
    • @Potatoswatter:我很好奇你为什么认为我的回答只是一个随机猜测。我的答案中的“也许”意味着我不确定这个答案,因为我不知道真正的问题是什么。恕我直言,这个问题属于meta.stackexchange.com/questions/66377/what-is-the-xy-problem
    • 啊,对不起。我想这就是他们对你投反对票的原因。 (最好证明涉及volatile的答案。)
    【解决方案3】:

    没有任何理由禁用此优化!你想达到什么目的?它有助于调试构建运行得更快而没有任何不良副作用。它还确保了依赖于 RVO 或 NRVO 的代码在调试和发布中的工作方式相同。

    【讨论】:

    • 我能想到一个(至少对我而言)非常重要的原因:教育!当编译器省略它们时,您如何向学生解释函数调用中的构造函数、移动/复制构造函数、析构函数!?!我非常感谢 g++ 支持这样的选择。
    • 我必须禁用它才能理解返回值的生命周期,我现在无法理解它,因为它不会创建临时值,只是直接复制它。
    • @Zebrafish 如果您要更改返回值的生命周期以了解返回值的生命周期,我认为您的理解不正确。
    • @Goran 你教他们错了,因为当他们尝试在现实世界中使用它时,他们的理解将突然不再适用......
    猜你喜欢
    • 2015-10-10
    • 2014-05-21
    • 2011-06-08
    • 2012-02-04
    • 1970-01-01
    • 2013-06-24
    • 2011-04-19
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多