メインコンテンツ

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

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

const パラメーター値によって移動操作が禁止され、その結果より高いパフォーマンスを必要とするコピー操作が発生することがある

説明

この欠陥は、関数パラメーターとしての const オブジェクトによって、移動操作が禁止され、その結果より高いパフォーマンスを必要とするコピー操作が行われる可能性がある場合に発生します。

チェッカーは、特定の関数呼び出しで、移動操作が可能かどうかをチェックしません。チェッカーは、非トリビアル コピー操作と移動操作でクラス型を使用する const 関数パラメーターを強調表示するだけです。パラメーターを呼び出し先の関数に移動できるかどうかはユーザーが自分で決定できます。

リスク

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

修正方法

パラメーターを呼び出し先関数に移動できることがわかっている場合は、const 修飾子をフラグ付きの関数パラメーターから削除します。

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

すべて展開する

#include <string>

std::string getStringFromUser() {
    //Get a string of arbitrary length
}

void countWordsInString(const std::string str) {
    //Count number of words in string
}

void main() {
    std::string aString = getStringFromUser();
    std::string anotherString = getStringFromUser();
    
    std::string joinedString = aString + anotherString;
    
    countWordsInString(joinedString);
    countWordsInString(aString + anotherString);
}

この例では、チェッカーが const str::stringstr パラメーターにフラグを設定します。以下の呼び出しなどで移動操作が可能な場合は、

countWordsInString(aString + anotherString);
const パラメーターによって、大幅にコストが増大する可能性があるコピー操作が強制的に実行されます。

結果情報

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

バージョン履歴

R2020a で導入