Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在VisualStudio2010中禁用返回值优化?_C++_Visual Studio_Visual Studio 2010_Return Value Optimization - Fatal编程技术网

C++ 如何在VisualStudio2010中禁用返回值优化?

C++ 如何在VisualStudio2010中禁用返回值优化?,c++,visual-studio,visual-studio-2010,return-value-optimization,C++,Visual Studio,Visual Studio 2010,Return Value Optimization,是否可以在VisualStudio2010中禁用RVO(返回值优化)?将优化标志设置为/Od(关闭所有优化)没有帮助。在g++中存在标志-fno elide构造函数,该构造函数禁用RVO。尝试将变量定义为volatile,可能会解决您的问题。如果没有,您应该发送come代码…您不能。就这么简单。RVO/NRVO是标准的,您的代码不应该依赖于它不存在。没有任何理由禁用此优化!你想达到什么目标?它可以帮助调试构建更快地运行,而不会产生任何不良副作用。它还确保依赖于RVO或NRVO的代码在调试和发布时

是否可以在VisualStudio2010中禁用RVO(返回值优化)?将优化标志设置为
/Od
(关闭所有优化)没有帮助。在g++中存在标志
-fno elide构造函数,该构造函数禁用RVO。

尝试将变量定义为
volatile
,可能会解决您的问题。如果没有,您应该发送come代码…

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

没有任何理由禁用此优化!你想达到什么目标?它可以帮助调试构建更快地运行,而不会产生任何不良副作用。它还确保依赖于RVO或NRVO的代码在调试和发布时工作相同。

据我所知,RVO/NRVO不是标准(请参阅C++0x标准,第12.8节。复制和移动类对象,第32段)。该标准只允许这样的优化(g++和VisualStudio实现了它)。我对此没有异议。但如果有一些开关来禁用它,那就太好了。也许是为了教育目的。谢谢,现在更清楚了:)@Goran:如果标准明确允许,那么它就是标准。允许!=要求因此,它不是标准的一部分,只是不会与标准冲突。“如果包含它并不与标准冲突,那么它就是标准。”我认为更准确的说法是“那么它是标准允许的”。这并不一定意味着编译器不应该提供关闭它的标志。例如,我想出于教育目的关闭它。@JamieS这是唯一一个真正有意义的动机。我可能会评论说,在测试中这样做是很棘手的,因为编译器实现RVO和friends的确切情况在不同的编译器或版本之间可能有所不同,因此更好的选择是不编写具有不纯净的复制/移动构造函数的对象。也就是说,你可能有遗留代码,等等,但这些代码并不能正确地做到这一点。我能想到一个(至少对我来说)非常重要的原因:教育!当编译器省略构造函数、移动/复制构造函数、析构函数时,如何向学生解释函数调用中的构造函数、析构函数!?!我非常感谢g++支持这样一个选项。我必须禁用它以了解返回值的生存期,我现在无法理解它,因为它不创建临时值,只需直接复制它即可。@Zebrafish如果您要更改返回值的生存期以了解返回值的生存期,我不认为你的理解是正确的。@Goran你教错了他们,因为当他们试图在现实世界中使用它时,他们的理解会突然停止应用…+1;虽然这只是一个随机猜测(因此值得投反对票),但是
返回my_volatile_变量是正确的不禁用RVO。(C++11§12.8/31第1项。)@Potatoswatter:我很好奇你为什么认为我的答案只是一个随机猜测。我的答案中的“可能”意味着我不确定这个答案,因为我不知道真正的问题是什么。伊姆霍,这个问题是关于啊,对不起。我想这就是他们否决你的原因。(最好证明包含
volatile
的答案是正确的)