阅读TheC++ProgrammingLanguage(第4版),在异常处理一章中,有一个用于adhoc清理代码的示例助手:templatestructFinal_action{Final_action(Ff):clean{f}{}~Final_action(){clean();}Fclean;};templateFinal_actionfinally(Ff){returnFinal_action(f);}像这样使用autoact1=finally([&]{deletep;});在声明act1的block末尾运行lambda代码。由于返回值优化限制Final_action,我想这在他测
这里有很多关于何时可以完成RVO的讨论,但关于何时真正完成的讨论并不多。正如多次声明的那样,RVO不能根据标准得到保证,但是有没有办法保证RVO优化成功或相应代码编译失败?到目前为止,我部分成功地在RVO失败时使代码发出链接错误。为此,我声明了复制构造函数而不定义它们。显然,在我需要实现一个或两个复制构造函数(即x(x&&)和x(xconst&))的极少数情况下,这显然既不稳健也不可行。这引出了我的第二个问题:为什么编译器编写者选择在用户定义的复制构造函数就位时启用RVO,而不是在仅存在默认复制构造函数时选择启用RVO?第三个问题:是否有其他方法可以为普通数据结构启用RVO?最后一个问
假设我有一个类,其中复制构造函数是私有(private)的并且未实现(使对象不可复制)classNonCopyable{//whateverprivate:NonCopyable(constNonCopyable&);voidoperator=(constNonCopyable&);};现在在同一个类的一些成员函数中,我编写了返回该类对象的代码:NonCopyableNonCopyable::Something(){returnNonCopyable();}这是RVO可以启动的情况。RVO仍然要求复制构造函数是可访问的。由于对复制构造函数的可能调用是从同一个类成员函数中完成的,因此复制
首先请看下面的代码,它由2个翻译单元组成。---foo.h---classFoo{public:Foo();Foo(constFoo&rhs);voidprint()const;private:std::stringstr_;};FoogetFoo();---foo.cpp---#includeFoo::Foo():str_("hello"){std::cout请确保foo.cpp和main.cpp是不同的翻译单元。因此,根据我的理解,我们可以说在翻译单元main.o(main.cpp)中没有可用的getFoo()的实现细节。但是,如果我们编译并执行上面的代码,我看不到指示RVO在这里
在C++17中,我们将有可能返回不可移动(包括不可复制)类型,例如std::mutex,这可以被认为是保证返回值优化(RVO):Guaranteedcopyelisionthroughsimplifiedvaluecategories:structnocopy{nocopy(nocopy&)=delete;nocopy()=default;};autogetRVO(){returnnocopy();}我们也会有structuredbindings,允许:tuplef();auto[x,y,z]=f();或者(这里也使用我对特性templateargumentdeductionforco
考虑从函数返回启用move语义的“完整”对象的情况,如std::basic_string:std::wstringbuild_report()const{std::wstringreport;...returnreport;}那么,我是否真的可以做出“最佳”选择,是否将返回的字符串与move语义一起使用,如conststd::wstringreport(std::move(build_report()));或者如果我应该依靠(N)RVO来发生conststd::wstringreport(build_report());或什至将const引用绑定(bind)到临时用conststd::
在[C++11:12.8/31]中有说明:Thiselisionofcopy/moveoperations,calledcopyelision,ispermitted[...]:—inareturnstatementinafunctionwithaclassreturntype,whentheexpressionisthenameofanon-volatileautomaticobject(otherthanafunctionorcatch-clauseparameter)withthesamecv-unqualifiedtypeasthefunctionreturntype,thec
我在回答aquestion并推荐returnby-valueforalargetype因为我确信编译器会执行return-valueoptimization(RVO).但后来有人向我指出,VisualStudio2013没有在我的代码上执行RVO。我找到了aquestionhere关于VisualStudio未能执行RVO,但在这种情况下,结论似乎是,如果它真的很重要,VisualStudio将执行RVO。就我而言,它确实很重要,它会对性能产生重大影响,我已经通过分析结果证实了这一点。这是简化的代码:#include#include#includestructFoo{std::vect
在许多情况下,当从函数返回一个局部变量时,RVO(返回值优化)会起作用。但是,我认为显式使用std::move至少会在RVO不执行move时强制执行发生,但在可能的情况下仍会应用RVO。然而,似乎并非如此。#include"iostream"classHeavyWeight{public:HeavyWeight(){std::cout我用VC++11和GCC4.71测试了这段代码,调试和发布(-O2)配置。复制ctor永远不会被调用。movector仅在调试配置中由VC++11调用。实际上,特别是这些编译器似乎一切都很好,但据我所知,RVO是可选的。但是,如果我明确使用move:Hea
RVO(ReturnValueOptimization)是否保证或适用于C++编译器(特别是GCC)中的所有对象和情况?如果答案是“否”,那么对类/对象进行这种优化的条件是什么?如何强制或鼓励编译器对特定返回值执行RVO? 最佳答案 返回值优化可以总是应用,不能普遍应用的是命名返回值优化。基本上,为了进行优化,编译器必须知道在构造对象的地方将返回什么对象。在RVO(返回一个临时值)的情况下,该条件很容易满足:在return语句中构造对象,然后返回。对于NRVO,您必须分析代码以了解编译器是否知道该信息。如果函数的分析很简单,编译器很