より効率的なオーバーロードの代わりに、計算量の多い std::string メソッドを使用
説明
この欠陥は、一重引用符で囲んだ文字の代わりに、長さが既知の文字列リテラルを使用して特定の std::string メソッドを呼び出す場合に発生します。文字列リテラルを使用して特定の std::string メソッドを呼び出すと、リテラルの長さがコンパイル時に既知であっても、メソッドがその長さを計算しなければなりません。Polyspace はこのような呼び出しに対し、非効率としてフラグを設定します。たとえば、Polyspace® は次の std::string::find の呼び出しのうち、最初の 2 つの呼び出しにフラグを設定します。
std::string str;
//...
str.find("A");//Inefficient
//...
str.find("ABC",offset,1);//Inefficient
str.find('A');//Efficient
std::string メソッドが呼び出される場合、Polyspace はこの欠陥を報告します。
findrfindfind_first_offind_last_offind_first_not_offind_last_not_ofreplaceoperator=operator+=starts_with(C++20)ends_with(C++20)
リスク
場合によっては、文字列リテラルまたは一重引用符で囲んだ文字のいずれかを使用して std::string メソッドを呼び出すことができます。その場合、文字列リテラルを使用した std::string メソッドの呼び出しは、実行前に既知となっている文字列リテラルの長さをコンパイラに計算させるため、非効率です。std::string メソッドは頻繁に使用されることから、このような非効率なメソッド呼び出しによって、コードの計算量が増え、非効率となる可能性があります。
修正方法
この問題を修正するには、適切な場合は文字列リテラルではなく、一重引用符で囲んだ文字を使用して std::string メソッドを呼び出します。たとえば、単一の文字や単一の文字の繰り返しからなる文字列リテラルの代わりに、一重引用符で囲んだ文字を入力として使用できる場合があります。一重引用符で囲まれた文字を受け入れる、メソッドの別のオーバーロードを使用しなければならない場合もあります。
パフォーマンスの改善の程度は、使用しているコンパイラ、ライブラリ実装、環境によって異なる可能性があります。
例
結果情報
| グループ: パフォーマンス |
| 言語: C++ |
| 既定値: オフ |
コマンド ライン構文: EXPENSIVE_USE_OF_STD_STRING_METHODS |
| 影響度: Low |
バージョン履歴
R2021a で導入