C++11 具有元组成员的对象的移动构造函数的性能 我有一个关于移动构造函数的性能问题,伪C++类: typedef tuple<std::string, std::vector<double>, ...and more...> FooTupleMember; class Foo1 { public: Foo1::Foo1 (Foo1&& object) : member (std::move (object.member)) { // ... } private: FooTupleMember member; }; class Foo2 { public: Foo2::Foo1 (Foo2&& object) : member (std::move (object.member)) { // ... } private: std::unique_ptr<FooTupleMember> member; }; typedef元组成员; Foo1类 { 公众: Foo1::Foo1(Foo1&对象): 成员(std::move(object.member)) { // ... } 私人: 足部成员; }; 第二类 { 公众: Foo2::Foo1(Foo2&对象): 成员(std::move(object.member)) { // ... } 私人: std::唯一的ptr成员; };

C++11 具有元组成员的对象的移动构造函数的性能 我有一个关于移动构造函数的性能问题,伪C++类: typedef tuple<std::string, std::vector<double>, ...and more...> FooTupleMember; class Foo1 { public: Foo1::Foo1 (Foo1&& object) : member (std::move (object.member)) { // ... } private: FooTupleMember member; }; class Foo2 { public: Foo2::Foo1 (Foo2&& object) : member (std::move (object.member)) { // ... } private: std::unique_ptr<FooTupleMember> member; }; typedef元组成员; Foo1类 { 公众: Foo1::Foo1(Foo1&对象): 成员(std::move(object.member)) { // ... } 私人: 足部成员; }; 第二类 { 公众: Foo2::Foo1(Foo2&对象): 成员(std::move(object.member)) { // ... } 私人: std::唯一的ptr成员; };,c++11,tuples,rvalue,C++11,Tuples,Rvalue,当我移动Foo1类的对象时,它将初始化存储在元组中的所有对象的移动构造函数,对吗?这意味着,移动操作可能相当昂贵 但我移动Foo2类的对象整个移动操作要快得多,因为我只传递存储在智能指针中的数据的内部指针,对吗 很明显,R值引用比l值引用更快,因为需要的复制操作要少得多。然而,使用移动构造函数从函数返回对象比将同一对象存储在智能指针中并返回智能指针更昂贵 通过L值移动对象非常慢,通过智能指针移动它很快,通过R值移动它在中间某个地方。 我看不到r值的“力量”,因为它不像很多人说的那样有效。使用智能

当我移动Foo1类的对象时,它将初始化存储在元组中的所有对象的移动构造函数,对吗?这意味着,移动操作可能相当昂贵

但我移动Foo2类的对象整个移动操作要快得多,因为我只传递存储在智能指针中的数据的内部指针,对吗

很明显,R值引用比l值引用更快,因为需要的复制操作要少得多。然而,使用移动构造函数从函数返回对象比将同一对象存储在智能指针中并返回智能指针更昂贵

通过L值移动对象非常慢,通过智能指针移动它很快,通过R值移动它在中间某个地方。


我看不到r值的“力量”,因为它不像很多人说的那样有效。使用智能指针而不是r值更好(我的意思是更快),而且代码优雅清晰。我说得对吗?

如果你的类有很多成员,那么你必须移动所有成员(或者移动到有意义的程度)。这总是比移动单个(智能)指针更昂贵,但可能比复制成本更低

但是,将数据存储在堆上,以便通过指针访问它(使移动速度更快),将影响其余代码的性能,因为每次访问都必须取消对指针的引用

配置文件,并优化慢速位。如果移动不是一个瓶颈,那么做什么可以让剩下的代码更快,反之亦然