在浏览 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 或在编译时类似的东西是否更好?