草庐IT

c++ - GCC NRVO/RVO 警告

是否有任何警告,让我们知道NRVO/RVO在GCC中是否执行?我发现-fno-elide-constructors关闭NRVO/RVO,但是NRVO/RVO有它自己的条件发生并且有时不会发生。有必要知道NRVO/RVO是否发生,以便了解何时发生额外的复制构造。我对编译时特性特别感兴趣。如果有一些特定的#pragmaGCC...(它会在其自身之后立即激活诊断)或使用静态断言机制的东西,那就太好了。 最佳答案 我不知道任何gcc特定的诊断消息或其他可以轻松解决您的任务的方法。正如您所发现的,-fno-elide-constructors

c++ - GCC NRVO/RVO 警告

是否有任何警告,让我们知道NRVO/RVO在GCC中是否执行?我发现-fno-elide-constructors关闭NRVO/RVO,但是NRVO/RVO有它自己的条件发生并且有时不会发生。有必要知道NRVO/RVO是否发生,以便了解何时发生额外的复制构造。我对编译时特性特别感兴趣。如果有一些特定的#pragmaGCC...(它会在其自身之后立即激活诊断)或使用静态断言机制的东西,那就太好了。 最佳答案 我不知道任何gcc特定的诊断消息或其他可以轻松解决您的任务的方法。正如您所发现的,-fno-elide-constructors

c++ - 为什么这里不应用 NRVO?

当我在VS2010中运行此代码时,不应用NRVO。#includeclassA{public:A(){printf("Iaminconstructor\n");}A(constA&a){printf("Iamincopyconstructor\n");}~A(){printf("Iamindestructor\n");}inti;};Af(intj){Aa;if(j)returna;a.i=j;returna;}intmain(){Aa;a=f(5);}编辑:这与析构函数有关。当我注释掉它的行时,使用了NRVO。但这是为什么呢? 最佳答案

c++ - 为什么 clang 不使用 NRVO 对此进行优化?

我试图解释为什么一个相当不错的C++11编译器(clang)没有优化这段代码,并且想知道这里是否有人有意见。#include#defineSLOWstructA{A(){}~A(){std::cout如果我用#defineSLOW注释掉并用-s优化运行它,我得到HelloWorld!AmoveAd'tor0x7fff5fbff9f0Ad'tor这是预期的。如果我在启用#defineSLOW并使用-s优化的情况下运行它,我得到:HelloWorld!AcopyAmoveAd'torAd'tor0x7fff5fbff9e8Ad'tor这显然不是很好。所以问题是:为什么我没有看到在“SLOW

c++ - 存储指向用 NRVO 返回的对象的指针

如果我编写一个在本地实例化对象然后按值返回的工厂方法,打算利用NRVO(根据此处的一些答案:c++11Returnvalueoptimizationormove?),将指向本地对象的指针/引用指向分配给方法返回值的对象?ObjectObjectBuilder::BuildObject(void){Objectobj;//this->ObjectReference=obj;//Disregardthis//ORthis->ObjectPtr=&obj;returnobj;}正在使用中:ObjectBuilderbuilder;ObjectnewObject=builder.BuildOb

c++ - NRVO 不应该保证本地命名变量和调用站点变量采用相同的地址吗?

我认为应该这样做,因为它对正确性很重要。但是,我很惊讶地看到Clang的输出。考虑以下代码:#includestructS{inti;S(inti):i(i){}S(S&&){std::cout我们为S定义了一个movector来检查S(S&&)是否被调用,如果没有,则应用NRVO。我们从GCC看到的结果是:0x7ffc3ed7b5ac0x7ffc3ed7b5ac42应用了NRVO,它们采用相同的地址,这是预期的。但是,Clang的output:0x7fff908bbcc80x7fff908bbcf842应用了NRVO,但地址不同。如果您想知道为什么拥有相同的地址很重要-这是因为某些对

c++ - C++11 编译器何时会使 RVO 和 NRVO 优于 move 语义和 const 引用绑定(bind)?

考虑从函数返回启用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++ - move 或命名返回值优化 (NRVO)?

假设我们有以下代码:std::vectorf(){std::vectory;...returny;}std::vectorx=...x=f();似乎编译器在这里有两种方法:(a)NRVO:破坏x,然后构造f()代替x。(b)move:在临时空间中构造f(),将f()move到x中,销毁f()。根据标准,编译器可以自由使用这两种方法吗? 最佳答案 编译器可以NRVO进入临时空间,或将构造move到临时空间。从那里它会moveassignx.更新:任何时候您想使用右值引用进行优化,但您对结果不满意,请为自己创建一个跟踪其状态的示例类:构

c++ - 为什么按值参数从 NRVO 中排除?

想象一下:Sf(Sa){returna;}为什么不允许别名a和返回值槽?Ss=f(t);Ss=t;//can'tgenerallytransformittothis:(如果S的复制构造函数有副作用,规范不允许这种转换。相反,它至少需要两份拷贝(一份从t到a,一份从a到返回值,另一份从返回s的值,只有最后一个可以省略。请注意,我在上面写了=t来表示t拷贝的事实到f的a,唯一的拷贝在存在移动/复制构造函数的副作用的情况下仍然是强制性的)。这是为什么呢? 最佳答案 这就是为什么复制省略对参数没有意义。这实际上是关于在编译器级别实现概念的。