メインコンテンツ

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

計算量の多いローカル変数のコピー

ローカル変数が const 参照からのコピーで作成された後、変更されない

R2021a 以降

説明

この欠陥は、ローカル変数が const 参照からのコピーで作成された後、変更されない場合に発生します。

たとえば、変数 name は、関数 get_name によって返された const 参照からのコピーで作成されます。

const std::string& get_name();
...
void func {
    std::string name = get_name();
}
この欠陥が発生するのは、ローカル変数が非トリビアル コピー可能な型であるか、サイズが 2 * sizeof(void *) より大きいトリビアル コピー可能な型である場合のみです。

リスク

変数が const 参照から作成され、変更されない場合は、変数自体を const 参照として定義できます。const 参照を作成すると、計算量が多くなる可能性のあるコピー操作が回避されます。

修正方法

ローカル変数を後で変更する意図がない場合は、const 参照からのコピーによる新しいローカル変数の作成を避けます。代わりに const 参照を作成します。

たとえば、前のセクションでの変数 name は次のように再定義できます。

const std::string& get_name();
...
void func {
    const std::string& name = get_name();
}

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

すべて展開する

#include <string>

class Task
{
public:
    // ...
    const std::string& get_name() const;
    // ...
private:
    // ...
};

void inspect( const Task& task )
{
    // ...
    const std::string name = task.get_name(); 
    // ...
}

この例では、変数 nameconst 参照からのコピーによって作成されますが、後で変更されません。

修正 — const 参照を使用

計算量が多くなる可能性のあるコピー操作を回避するには、ローカル変数を後で変更する意図がない場合は、新しいローカル変数の作成を避けます。代わりに、const 参照の戻り値を別の const 参照に割り当てます。

#include <string>

class Task
{
public:
    // ...
    const std::string& get_name() const;
    // ...
private:
    // ...
};

void inspect( const Task& task )
{
    // ...
    const std::string& name = task.get_name(); 
    // ...
}

結果情報

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

バージョン履歴

R2021a で導入