C++14/C++1y (n3690) の草案にざっと目を通していると、セクション §21.7 でbasic_string
リテラル接尾辞が導入されていることに気付きました。
inline namespace literals {
inline namespace string_literals {
// 21.7, suffix for basic_string literals:
string operator "" s(const char *str, size_t len);
u16string operator "" s(const char16_t *str, size_t len);
u32string operator "" s(const char32_t *str, size_t len);
wstring operator "" s(const wchar_t *str, size_t len);
}
}
私の質問は次のとおりです。
basic_string
リテラルを使用すると、実行時に高速になる可能性はありますか?- 私の「素朴な」実装は完全に間違っていますか?
- ROM 内のデータのレイアウトは、
basic_string
リテラルで異なる可能性がありますか、またはコンパイル時と実行時のその他の違いはありますか?
バックグラウンド
これにより、次のような文字列リテラルを直接使用できることがわかっています。
std::string s1 = "A fabulous string"s;
void sfunc(std::string arg);
int main() {
sfunc("argument"s);
}
しかし、変換コンストラクター に依存することの利点は何string(const char*)
ですか?
「古い」コードは次のようになります。
std::string s1 = "A fabulous string"; // c'tor string(const char*)
void sfunc(std::string arg);
int main() {
sfunc("argument"); // auto-conversion via same c'tor
}
私が見る限り、の実装operator "" s()
は基本的に次のようになります。
std::string operator "" s(const char* lit, size_t sz) {
return std::string(lit, sz);
}
つまり、同じc'torを使用するだけです。そして私の推測では、それは実行時に行われなければならないということですが、私は間違っていますか?
編集:Nicol Bolasが私の例の下で正しく指摘したように、同じコンストラクターを使用していませんが、追加の長さを持つコンストラクターを使用しています。これは明らかに、構築に非常に役立ちます。これは私に疑問を残します: これは、コンパイラが文字列リテラルを ROM に入れること、またはコンパイル時に同様のものを入れることよりも良いですか?