メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

const の戻り値によって不要なデータ コピーが生じることがあります

const の戻り値によって移動操作が禁止され、より高いパフォーマンスが必要なコピー操作が行われる場合がある

説明

この欠陥は、戻り値としての const オブジェクトによって、移動操作が禁止され、より高いパフォーマンスが必要なコピー操作が行われる場合に発生します。

チェッカーは、任意の呼び出し元関数で移動操作が可能かどうかをチェックしません。チェッカーは、非トリビアルなコピー操作と移動操作でクラス型を使用する const 関数戻り値を強調表示するだけです。

リスク

関数戻り値に関連付けられたリソースが不要になり、呼び出し元の関数内のオブジェクトに移動できます。一般的に、移動操作の方がコピー操作よりコストがかからないため、コンパイラは、この状況では移動操作が使用されるようにします。const オブジェクトを戻り値として使用する場合は、このコンパイラの最適化を明示的に回避します。

加えて、呼び出し元の関数は非 const オブジェクトに戻り値を格納できます。戻り値の const の特性によって、非 const オブジェクトに対する操作が禁止されることはありません。

修正方法

関数戻り値から const 修飾子を削除します。

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

すべて展開する

#include <string>

class stringPair {
    std::string str1;
    std::string str2;
    
    public: 
    stringPair& operator=(const stringPair & aPair){
        if(&aPair != this) {
            str1 = aPair.str1;
            str2 = aPair.str2;
        }
        return *this;
    }
    
    const std::string getJoinedString(void) {
        return (str1 + str2);
    }
};

この例では、getJoinedString の戻り値上の const 指定子によって、移動操作の代わりにコピー操作が強制されます。

結果情報

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

バージョン履歴

R2020a で導入