今日、いくつかのタイミングコードで遊んでいたところ、文字列リテラルをstd :: stringに割り当てると、約10%高速であることがわかりました(12文字の短い文字列の場合、大きな文字列の場合はさらに大きな違いがあります)。 (sizeof演算子を使用して)既知の長さのリテラルを使用します。(VC9コンパイラでのみテストされているので、他のコンパイラの方がうまくいくと思います)。
std::string a("Hello World!");
std::string b("Hello World!", sizeof("Hello World!");//10% faster in my tests
さて、私が疑う理由は、文字列の長さを取得するためにstrlenを呼び出さなければならないためです(VC9は私の強みではないため、100%確実ではありません)。その後、2番目の場合と同じようにします。
std :: stringが存在していた期間と、最初のケースが実際のプログラムでどれほど一般的であるか(特に、+、=、+ =などの演算子と同等のメソッドを含める場合)を考えると、どうして最初のケースが最適化されないのでしょうか。 2番目に?std :: basic_stringオブジェクトであり、リテラルであるかどうかを言うのも非常に単純なようです。bのように記述されているかのようにコンパイルしますか?