用元组成员移动对象的构造函数的性能

时间:2010-11-06 14:27:22

标签: c++11 tuples rvalue

我对移动构造函数,伪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 个答案:

答案 0 :(得分:1)

如果你的班级有很多成员,那么你必须移动所有这些成员(或者足以使这一举动有意义)。这总是比移动单个(智能)指针更昂贵,但可能比复制更便宜。

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

配置文件,并优化慢速位。如果移动不是瓶颈,那么做什么使得其余代码更快,反之亦然。