メインコンテンツ

Const std::move 入力により、オブジェクトのコピーの計算量が増大する可能性がある

Const std::move 入力は移動できないため、より計算量の多いコピー操作が行われる

説明

この欠陥は、const オブジェクトに対して std::move を使用することによって、より計算量の多いコピー操作が行われることによって発生します。l

チェッカーは、非トリビアルなコピー操作と移動操作を伴うクラス型に対してのみ違反を発生させます。

リスク

const オブジェクトは、変更できないため、移動できません。const オブジェクトに対する std::move は、コンパイル エラーなしでコピー操作に戻されます。問題に気付くことなく、コードのパフォーマンスが低下する可能性があります。

修正方法

移動するオブジェクトから const 修飾子を削除します。

代わりにコピー操作が必要な場合は、冗長な std::move 呼び出しを削除します。

この問題はチェッカーの [const オブジェクトの移動操作] をトリガーすることにも注意してください。このことは、このクラス型に移動操作と非トリビアルなコピー操作があるかどうかに関係なく、const オブジェクトに対するすべての移動操作に適用されます。問題を正当化する場合は、両方の結果に対して同じ正当化を使用できます。

パフォーマンスの改善の程度は、使用しているコンパイラ、ライブラリ実装、環境によって異なる可能性があります。

すべて展開する

#include <string>

#include <string>

class MyClass {
public:
    void setName( const std::string& name ) {
        m_name = std::move( name );
    }
private:
    std::string m_name;
};

この例では、const オブジェクト name に対して std::move が呼び出されています。移動代入の代わりに、より計算量の多いコピー代入が実行されます。

const 修飾子の削除

移動操作が必要な場合は、移動するオブジェクトの定義から const 修飾子を削除します。

#include <string>

#include <string>

class MyClass {
public:
    void setName( std::string& name ) {
        m_name = std::move ( name );
    }
private:
    std::string m_name;
};

結果情報

グループ: パフォーマンス
言語: C++
既定値: オフ
コマンド ライン構文: EXPENSIVE_STD_MOVE_CONST_OBJECT
影響度: Medium

バージョン履歴

R2020b で導入