草庐IT

c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导

UPDATE1:C++17为构造函数添加了类型推导-这并不意味着自由函数是一个劣质的解决方案。UPDATE2:C++17增加了保证复制省略(复制在概念上甚至不会发生)。因此,使用C++17,我的代码实际上可以工作并且具有最佳性能。但是我相信Martinho的代码使用大括号初始化返回值仍然是更干净的解决方案。但结帐thisanswerfromBarry以及T.C.的评论OLDPOST:类型推导不适用于构造函数(至少在C++11之前并包括在内)。常见的解决方案是依靠RVO(返回值优化),编写一个make_XYZ模板函数,将其参数转发给构造函数。一个例子是std::make_tuple。任何

c++ - 即使 XZY 具有非复制约束,构造助手 make_XYZ 也允许 RVO 和类型推导

UPDATE1:C++17为构造函数添加了类型推导-这并不意味着自由函数是一个劣质的解决方案。UPDATE2:C++17增加了保证复制省略(复制在概念上甚至不会发生)。因此,使用C++17,我的代码实际上可以工作并且具有最佳性能。但是我相信Martinho的代码使用大括号初始化返回值仍然是更干净的解决方案。但结帐thisanswerfromBarry以及T.C.的评论OLDPOST:类型推导不适用于构造函数(至少在C++11之前并包括在内)。常见的解决方案是依靠RVO(返回值优化),编写一个make_XYZ模板函数,将其参数转发给构造函数。一个例子是std::make_tuple。任何

c++ - 为什么结构化绑定(bind)禁用 RVO 并继续返回语句?

假设我们有一个名为AAA的类,它同时支持copy/move:classAAA{public:AAA()=default;~AAA()=default;AAA(constAAA&rhs){std::cout在下面的代码中,get_val返回second:AAAget_val(){auto[first,second]=std::make_tuple(AAA{},AAA{});std::cout现在second被复制,打印以下输出:...Returning-CopyconstructorReturned-这很不幸,因为我对结果的期望是要么没有调用复制构造函数,要么至少它被隐式移动了。为避免复

c++ - 为什么结构化绑定(bind)禁用 RVO 并继续返回语句?

假设我们有一个名为AAA的类,它同时支持copy/move:classAAA{public:AAA()=default;~AAA()=default;AAA(constAAA&rhs){std::cout在下面的代码中,get_val返回second:AAAget_val(){auto[first,second]=std::make_tuple(AAA{},AAA{});std::cout现在second被复制,打印以下输出:...Returning-CopyconstructorReturned-这很不幸,因为我对结果的期望是要么没有调用复制构造函数,要么至少它被隐式移动了。为避免复

c++ - tuple/tie的返回值优化

我正在研究元组/关系的返回值优化,我观察到的行为与我预期的不同。在下面的示例中,我希望移动语义能够发挥作用,它确实如此,但是仍然存在一个复制操作。以下优化后的输出为:Testduooutput,non_referencetupleDefaultconstructorinvokedParameterconstructorinvokedCopyconstructorinvokedMoveAssignmentoperatorinvoked100在函数内部创建元组时调用复制构造函数似乎是不必要的。有什么办法可以去掉这个吗?我正在使用MSVC2012编译器。#include#includecla

c++ - tuple/tie的返回值优化

我正在研究元组/关系的返回值优化,我观察到的行为与我预期的不同。在下面的示例中,我希望移动语义能够发挥作用,它确实如此,但是仍然存在一个复制操作。以下优化后的输出为:Testduooutput,non_referencetupleDefaultconstructorinvokedParameterconstructorinvokedCopyconstructorinvokedMoveAssignmentoperatorinvoked100在函数内部创建元组时调用复制构造函数似乎是不必要的。有什么办法可以去掉这个吗?我正在使用MSVC2012编译器。#include#includecla

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++ - 为什么 RVO 不应用于基类子对象初始化?

为什么Base的移动构造函数在以下代码(在gcc7.2和clang4.0中)的继承(classB)的情况下是强制性的?我希望在C++17中保证复制省略不需要它,就像组合(classA)的情况一样。structBase{Base(Base&&)=delete;Base&operator=(Base&&)=delete;Base(){}};Basemake_base(){returnBase{};}structA{A():b(make_base()){}//example 最佳答案 AccordingtoRichardSmith:Thi

c++ - 为什么 RVO 不应用于基类子对象初始化?

为什么Base的移动构造函数在以下代码(在gcc7.2和clang4.0中)的继承(classB)的情况下是强制性的?我希望在C++17中保证复制省略不需要它,就像组合(classA)的情况一样。structBase{Base(Base&&)=delete;Base&operator=(Base&&)=delete;Base(){}};Basemake_base(){returnBase{};}structA{A():b(make_base()){}//example 最佳答案 AccordingtoRichardSmith:Thi