0

move コンストラクター、疑似 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クラスのオブジェクトを移動するのは、スマート ポインタに格納されたデータの内部ポインタのみを渡すだけなので、全体の移動操作ははるかに高速ですよね?

必要なコピー操作がはるかに少ないため、右値参照は左値参照よりも高速です。ただし、move コンストラクターを使用して関数からオブジェクトを返すと、同じオブジェクトをスマート ポインターに格納してスマート ポインターを返すよりもコストがかかります。

左辺値によるオブジェクトの移動は非常に遅く、スマート ポインターによる移動は非常に高速で、右辺値による移動はその中間です。

多くの人が言うほど効果的ではないため、r値の「力」はわかりません。r値の代わりにスマートポインターを使用する方が私見の方が優れており(つまり、高速です)、コードはエレガントで明確です。私は正しいですか?

4

1 に答える 1

1

クラスに多くのメンバーがいる場合は、それらすべてを移動する必要があります (または移動が意味を成すのに十分な数)。これは常に、単一の (スマート) ポインターを移動するよりもコストがかかりますが、コピーするよりはコストがかからない可能性があります。

ただし、ポインターを介してアクセスできるように (移動を高速化するために) ヒープにデータを格納すると、すべてのアクセスでポインターを逆参照する必要があるため、コードの残りの部分のパフォーマンスに影響を与えます。

プロファイリングし、低速ビットを最適化します。移動がボトルネックでない場合は、コードの残りの部分を高速化する方法を実行します。逆の場合も同様です。

于 2010-11-08T21:45:39.083 に答える