gpt4 book ai didi

c++ - 常量字符串的 std::string_view 复杂度

转载 作者:行者123 更新时间:2023-12-04 01:04:18 30 4
gpt4 key购买 nike

我正在开发内部包含大量静态字符串的库。为了稍微优化运行时,应将其从空终止字符串(经典的 C 风格字符数组)更改为已知长度的结构,如 std::stringstd: :string_view 或自定义指针+长度对。 std::string 众所周知且用途广泛,但缺点是占用空间大(在 x64 上至少是 32 位)加上 VM 开销(堆和运行时成本)如果小字符串优化不适用,这影响了我的大部分数据。 string_view 听起来是最好的选择,只要我能确定数据以 null 结尾(尽管 string_view 本身没有这样的保证,风险可以通过惯例)。

仍然很重要的问题:现代编译器是否在不使用内部 strlen 的情况下预初始化 string_view,即具有恒定的复杂性而不是 O^(n)?如果他们这样做了,是否保留了空终止符?

当然,我可以添加一些宏来初始化 string_views,但这会很麻烦。像这样的东西:

#define foo(buf) foo, (sizeof(foo)-1)
const string_view svMyVar(foo("original C-string value"));

我希望编译器能为我简化它。

最佳答案

不幸的是,std::string_view没有采用 const char (&) [N] 的构造函数,但只有(与 const char* 相关)const char*const char*, std::size_t 大小。前者计算长度,后者给出。

你可能有函数而不是宏

template <std::size_t N>
std::string_view make_string_view(const char* (&s)[N]) { return {s, N - 1}; }

operator ""sv甚至可能更简单(在编译时也知道/使用大小来构造 string_view):

  • “ Hello World ”sv

请注意,如果需要,您可以包含 \0:

  • "hello world\0"sv

关于c++ - 常量字符串的 std::string_view 复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67002857/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com