const 字符串仍然更可取吗?
Is a const string Still Preferable?
我在这里问了一个关于迭代器的问题: 因此我开始了解它们提供的一些保护和调试功能。
不过,我相信 begin
and end
现在在 C 风格数组上提供了类似的可能性。
如果我想创建一个只在 STL 算法中迭代的 const string
,使用 const string
是否仍然有优势,或者我应该更喜欢 const char[]
begin
和 end
?
所以答案取决于您使用的 c++ 版本
C++98
因为 C++98 没有 std::begin
or std::end
the best move is just to accept you're going to have to pay the costs of construction and use std::string
. If you have boost available you should still consider boost::string_ref
有两个原因。首先,它的构造总是避免分配,总体上比 std::string
.
简单得多
boost::string_ref
有效,因为它只存储指向字符串和长度的指针。因此在所有情况下开销都是最小的。
c++11
与 C++98 非常相似,除了使用 boost::string_ref
的建议变得 MUCH 更强大,因为 c++11 有 constexpr
允许编译器通过在编译时构造对象来完全绕过构造。
c++1z
据称(这不是最终版本)图书馆基础 TS 将带给我们 std::string_view
。 boost::string_ref
是 std::string_view
早期提案的原型,旨在以某种形式将功能引入所有版本的 C++。
关于 C++14 字符串文字
C++14 引入了语法为 "foo"s
的字符串文字,不幸的是这只是为了方便。因为 operator""s
不是 constexpr
,所以它不能在编译时求值,因此不能避免构造带来的惩罚。所以它可以用来使代码更漂亮,但在这种情况下它没有提供任何其他好处。
我在这里问了一个关于迭代器的问题:
不过,我相信 begin
and end
现在在 C 风格数组上提供了类似的可能性。
如果我想创建一个只在 STL 算法中迭代的 const string
,使用 const string
是否仍然有优势,或者我应该更喜欢 const char[]
begin
和 end
?
所以答案取决于您使用的 c++ 版本
C++98
因为 C++98 没有 std::begin
or std::end
the best move is just to accept you're going to have to pay the costs of construction and use std::string
. If you have boost available you should still consider boost::string_ref
有两个原因。首先,它的构造总是避免分配,总体上比 std::string
.
boost::string_ref
有效,因为它只存储指向字符串和长度的指针。因此在所有情况下开销都是最小的。
c++11
与 C++98 非常相似,除了使用 boost::string_ref
的建议变得 MUCH 更强大,因为 c++11 有 constexpr
允许编译器通过在编译时构造对象来完全绕过构造。
c++1z
据称(这不是最终版本)图书馆基础 TS 将带给我们 std::string_view
。 boost::string_ref
是 std::string_view
早期提案的原型,旨在以某种形式将功能引入所有版本的 C++。
关于 C++14 字符串文字
C++14 引入了语法为 "foo"s
的字符串文字,不幸的是这只是为了方便。因为 operator""s
不是 constexpr
,所以它不能在编译时求值,因此不能避免构造带来的惩罚。所以它可以用来使代码更漂亮,但在这种情况下它没有提供任何其他好处。