虽然掠过的草案C++ 14/C++ 1Y(n3690)我注意到引入basic_string
litertal后缀在节§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中的数据布局可能与文字不同,还是编译时与运行时间的差异?
背景
我知道,这使得像这样直接使用字符串文字:
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。我的猜测是,这必须在运行时完成,我错了吗?
编辑:作为尼科尔流星锤指出正确下面我举的例子的确不使用相同的构造,而是一个具有额外长度 - 这是建筑非常有用的,很明显。这给我留下了一个问题:这对编译器来说是更好的将字符串文字放入ROM中还是编译时类似的东西?
非常好的一点!具有长度是一个优势,果然。 – towi
关于性能,我怀疑字符串文字会提高使用静态const:'static std :: string lit(“Literal”);';他们甚至可能会明显变慢。不得不创造一个名称并声明一个额外的变量是一种痛苦,然而,字符串文字在这些理由上是一个明显的改进。 –