2010-11-06 58 views
0

我有一个关于移动构造函数的性能问题,伪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; 
}; 

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

但我谨foo2的类整个移动操作的对象就是要快得多,因为我只通过存储在智能指针数据的内部指针,对不对?

R值参考比l值尊敬更快,因为需要少得多的复制操作,这是显而易见的。然而,使用移动构造函数从函数返回对象仍然更昂贵,然后将相同的对象存储在智能指针中并返回智能指针。

通过l值移动对象非常慢,通过智能指针移动它非常快,并通过r值移动它在中间的某处。

我没有看到r值的“权力”,因为它没有许多人所说的那么有效。使用智能指针代替r值是恕我直言更好(我的意思是更快),它代码优雅和清晰。我对吗?

回答

1

如果你的班级有很多成员,那么你必须将他们全部移走(或者足够让移动变得有意义)。这通常比移动单个(智能)指针更昂贵,但可能比复制更便宜。

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

配置文件,并优化慢比特。如果移动不是一个瓶颈,那就做更快的代码,反之亦然。