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値の代わりにスマートポインターを使用する方が私見の方が優れており(つまり、高速です)、コードはエレガントで明確です。私は正しいですか?