使用用户定义的字面值而不是string字面值的优点
SO文档中的string主题在备注部分用来说:
因为C ++ 14不是使用
"foo"
,所以推荐使用"foo"s
,因为s
是一个string,将const char *
"foo"
为std::string
"foo"
。
我看到的唯一优势
std::string str = "foo"s;
代替
std::string str = "foo";
在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造函数调用要快。
尽pipe如此,(尚未)保证,所以第一个也可能调用构造函数,复制构造函数。
忽略需要使用std::string
文字的情况
std::string str = "Hello "s + "World!"s;
使用std::string
文字而不是const char[]
文字有什么好处吗?
如果你是“几乎总是自动”的人群的一部分,那么UDL是非常重要的。 它可以让你这样做:
auto str = "Foo"s;
因此, str
将是一个真正的std::string
,而不是一个const char*
。 因此它允许你决定什么时候该做什么。
这对于自动返回types扣除也很重要:
[]() {return "Foo"s;}
或者任何forms的演绎,真的是:
template<typename T> void foo(T &&t) {...} foo("Foo"s);
我所看到的唯一优点是,在第一种情况下,编译器可以执行copy-elision(我认为),这比第二种情况下的构造器调用要快。
Copy-elision不会比构造函数调用更快。 无论哪种方式,你调用对象的构造函数之一。 问题是哪一个 :
std::string str = "foo";
这将引发对std::string
的构造函数的调用,该函数使用一个const char*
。 但是由于std::string
必须将string复制到自己的存储中,所以它必须得到string的长度。 由于它不知道长度,所以这个构造函数被迫使用strlen
来获取它(技术上, char_traits<char>::length
,但这可能不会更快)。
相比之下:
std::string str = "foo"s;
这将使用具有此原型的UDL模板:
string operator "" s(const char* str, size_t len);
看, 编译器知道string文字的长度。 所以UDL代码传递一个指向string和大小的指针。 因此,它可以调用带有const char*
和 size_t
的std::string
构造const char*
。 所以不需要计算string的长度。
有问题的build议是不适合你去转换每一个文字的使用到s
版本。 如果你对char
数组的局限性没有问题,可以使用它。 build议是,如果你打算把这个文字存储在一个std::string
,那么最好把它当成一个文字,而不是一个含糊的const char*
。
使用"blah"s
build议与效率无关,都与新手代码的正确性有关。
在C中没有背景的C ++新手往往会认为"blah"
导致一些合理的stringtypes的对象。 例如,可以写一些像"blah" + 42
这样的东西,这个东西在许多脚本语言中都有效。 然而,在C ++中使用"blah" + 42
,只会导致未定义行为,寻址超出字符数组的末尾。
但是,如果这个string文字被写为"blah"s
那么会得到一个编译错误,这是非常可取的。
另外,UDL使string中的\0
更容易
std::string s = "foo\0bar"s; // s contains a \0 in its middle. std::string s2 = "foo\0bar"; // equivalent to "foo"s
- 使用C ++string,意味着我们不需要调用
strlen
来计算长度。 编译器已经知道了。 - 可能允许库实现string数据指向全局空间中的内存将使用C文字必须始终强制一个数据的副本堆积内存中的build设。