如何在Visual Studio 2010中禁用返回值优化?

12

在Visual Studio 2010中是否可以禁用RVO (return value optimization)?将优化标志设置为/Od(关闭所有优化)并不能解决问题。在g ++中存在标志-fno-elide-constructors,可用于禁用RVO。

3个回答

6
您无法这样做。这很简单。RVO / NRVO是标准的,您的代码不应该依赖于它不存在。

4
据我所知,RVO/NRVO不是标准(请参阅C++0x标准第12.8节“复制和移动类对象”,第32段落)。标准只是允许此类优化(g++和Visual Studio实现了它)。我对此没有意见。但是如果能有一些开关来禁用它就更好了,可能有助于教学目的。谢谢,现在清晰多了 :) - Goran
4
允许并不等同于要求。因此,它不是标准的一部分,仅仅不会与标准相矛盾。 - Jörgen Sigvardsson
1
如果包含它不违反标准,那么它就是标准。我认为更精确的说法是“它被标准允许”,这并不意味着编译器不应该提供一个关闭它的标志。例如,我想出于教育目的关闭它。 - Mark Vincze
1
@Puppy 这里的问题 - 即可能在问什么,以及我寻找答案时得出的结论 - 是您也不能编写假定它已包含的代码,因为符合标准的是不包含它的。因此,提供并遵守禁用选项的编译器符合标准,无论是否启用该选项。如果我想编写可移植的代码,我可能希望测试我的代码启用和禁用该选项,以确保它将与所有符合标准的编译器一起工作。使用编译器提供的禁用选项最容易实现这一点。 - Jamie S
1
@JamieS 这是唯一有意义的提出的动机。我可能会评论说,使用测试进行此操作很棘手,因为编译器实现RVO和friends的确切情况可能因编译器或版本而异,因此最好的选择是不编写具有不纯复制/移动构造函数的对象。话虽如此,您可能有遗留代码等未正确执行此操作。 - Puppy
显示剩余3条评论

2

尝试将您的变量定义为volatile,也许可以解决您的问题。如果无法解决,请发送一些代码...


+1;虽然这只是一个随机猜测(因此应该被投反对票),但“return my_volatile_variable;”确实禁用了RVO。(C++11 §12.8/31第1项。) - Potatoswatter
@Potatoswatter: 我好奇你为什么认为我的回答只是随意猜测。我回答中的“可能”表示我不确定这个答案,因为我不知道真正的问题是什么。在我看来,这个问题与http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem 类似。 - Malkocoglu
啊,抱歉。我想这就是他们对你投反对票的原因。(最好解释一下涉及“volatile”的答案。) - Potatoswatter

-2

从来没有理由禁用这个优化!你想要实现什么?它可以帮助调试构建更快地运行,而且完全没有任何副作用。它还确保依赖于 RVO 或 NRVO 的代码在调试和发布版本中的表现是相同的。


19
我可以想到至少一个非常重要的原因:教育!当编译器省略它们时,如何向学生解释构造函数、移动/复制构造函数和析构函数在函数调用中的作用?我非常感激g++支持这样的选项。 - Goran
1
我必须禁用它才能理解返回值的生命周期,现在我无法理解它,因为它不会创建临时副本,而是直接复制它。 - Zebrafish
@Zebrafish 如果你改变一个返回值的生命周期来理解它的生命周期,我认为你的理解是不正确的。 - Puppy
@Goran,你的教学方法有误,因为当他们在实际应用中尝试使用时,他们的理解会突然失效。 - Puppy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接