メインコンテンツ

単純な追加の代わりに、計算量の多い非メンバー std::string operator+() が使用されています

追加 (または +=) メソッドがより効率的であるのに、非メンバー関数 std::string operator+() が呼び出される

説明

この欠陥は、文字列への追加に非メンバー関数 std::string operator+() を使用する場合に発生します。以下に例を示します。

std::string s1;
s1 = s1 + "Other";

リスク

以下の演算を考えます。

s1 = s1 + "Other";
この演算は、代入の右辺で文字列を連結するために、非メンバー関数 std::string operator+() を呼び出します。この関数は一時文字列を返し、その文字列が s1 に代入されます。

メンバー関数 operator+=() を直接呼び出すと、この一時文字列の作成が回避され、より効率的になります。

修正方法

文字列への追加には、メンバー関数 operator+=() を使用します。以下に例を示します。

std::string s1;
s1 += "Other";
または、以下に示すようにメンバー関数 append を使用します。
std::string s1;
s1.append("Other");

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

すべて展開する

#include <string>

void addJunior(std::string &name) {
    name = name + ", Jr.";
}

void addSenior(std::string &name) {
    name += ", Sr.";
}

void addDoctor(std::string &name) { 
    name.append(", MD");
}

この例では、チェッカーが関数 addJunior での文字列追加にフラグを設定しますが、他の 2 つの関数での文字列追加にはフラグを設定しません。関数 addJunior がループで複数回呼び出される場合、毎回一時文字列が作成されると重大なパフォーマンスの問題となる可能性があります。

結果情報

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

バージョン履歴

R2020b で導入