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 值引用更快,因为它需要的复制操作要少得多,这很明显。然而,使用移动构造函数从函数返回对象仍然比将相同对象存储在智能指针中并返回智能指针更昂贵。

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

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

4

1 回答 1

1

如果您的班级有很多成员,那么您必须移动所有成员(或者无论如何移动都足够有意义)。这总是比移动单个(智能)指针更昂贵,但可能比复制更便宜。

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

分析并优化慢比特。如果移动不是瓶颈,那么做使其余代码更快的事情,反之亦然。

于 2010-11-08T21:45:39.083 回答