3

したがって、移動セマンティクスは優れており、パフォーマンスが向上します。

私はこれが完全に新しい機能であり、C++11なしではこれを行うことは「不可能」であることを読みました。

しかし、C ++ 11より前にこれを行うことはできますか?以下のようなもののように。

class AAA
{
private:
    int* m_data;
public:
    AAA(int _data) : m_data(new int(_data)) { }
    AAA(AAA& _other) // Not using RValue reference.
    {
        m_data = _other.m_data;
        _other.m_data = nullptr;
    }

    ~AAA() { delete m_data; }
};

int main()
{
    AAA sth1(100);
    AAA sth2(sth1)
    return 0;
}

RValue参照の存在は、引数がわずかに異なる同じ関数(ConstとNon-Constなど)を作成することではないと思いました。

簡単に言うと、別の「タイプ」であるRValue参照を使用すると、コピーコンストラクターと移動コンストラクターの両方を同時に実行できます。以上です。

私が正しいのか、何か大きなものが欠けているのか疑問に思います。

前もって感謝します。

4

4 に答える 4

3

std::auto_ptrあなたが提案したことを正確に行いました。問題は、動作が混乱し、コピーが不可能になることでした。右辺値参照を使用すると、移動とコピーの両方が可能なクラスを作成できます。

右辺値参照を使用すると、コンテキストに基づいた自動移動/コピー(一時的な移動など)が可能になり、左辺値スタイルのコピーコンストラクター(実際に移動を実行した)でこれをシミュレートしようとすると、悲惨な結果になる可能性があります。

于 2012-05-10T14:37:42.807 に答える
3

私の理解では、moveセマンティックは可能であるだけでなく、C ++ 03コンパイラのライブラリ( Boost.Move )としても利用できます(おそらくいくつかの制限があります)。ただし、言語の実装は、コードに触れることなく自由に最適化できるようにするためと、コードの使用を可能な限り単純化するための両方で必要だった可能性があります。

于 2012-05-10T14:38:28.493 に答える
0

はい、不足しているものがあります。これは、定数でない場合でも、左辺値では取得できません。非定数値は一時的なものから生成できないため、その場合は機能しません。

于 2012-05-10T14:37:07.000 に答える
0

コンストラクターに右辺値を渡したい場合はどうなりますか?非コンストラクターであるため、ctorは失敗します。右辺値参照を使用すると、右辺値は常に一時的なものであるため、コンストラクターに右辺値を渡し、そこから移動できます。

于 2012-05-10T14:38:24.457 に答える