问题标签 [string-view]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 为什么在 C++ 标准中没有 std::string_view 类型的参数的 std::basic_string 类的构造函数
标准类std::basic_string
没有接受类型对象作为其参数的“隐式”构造函数的原因是std::string_view
什么?
我希望这个程序能够编译。
c++17 - 为什么 std::string_view 不是微不足道的?
我想“迁移”到 C++17 并正在研究它。
我发现这是:
https://gcc.godbolt.org/z/sPnsEM
返回 1210,例如std::string_view
isstandard_layout
和trivially_copyable
,但令人惊讶的是 is not trivial
。
我在这里检查了一些实现:
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/experimental/string_view
而且我没有看到任何 d-tor。
那是因为它的c-tors吗?
c++ - 任何用 constexpr string_view 替换全局 const char[] 的陷阱?
我们的团队正在使用 10 多年的 C++ 代码库,最近切换到 C++17 编译器。所以我们正在寻找使我们的代码现代化的方法。在 YouTube 上的一次会议演讲中,我听到了将const char*
全局字符串替换为constexpr string_view
.
由于我们的代码中有很多这样的const char*
全局字符串常量,我想问一下是否有任何我们需要注意的问题或潜在问题?
c++ - 如果字符串视图为空终止,是否有一种安全的方法来断言?
我的代码中有一些部分广泛使用了字符串视图。在任何地方都使用是不可思议的std::string
,并且char const*
由于存在关联容器、许多比较和此类操作,这些操作很难用纯原始字符串进行。
但是,有一个地方最终会处理 C API,它需要以 null 结尾的字符串:
虽然这在我的情况下工作正常,但我想确保一切正常并断言字符串以空值结尾,因为我的系统构造字符串视图并将其发送到那里不会使用子字符串视图,并且会从字符串文字或std::string
. 我知道我会没事的。
然而问题是另一个程序员可能不知道所有这些并尝试substr
在字符串视图上使用,或者发送一个非空终止的字符串。非空终止的字符串是不好的,因为它会导致未定义的行为,但字符串视图中的子字符串更糟糕,因为发送到 C API 时不会应用上限,并且不会调用未定义的行为,但会而是引入了一个非常难以发现的带有意外行为的错误。
所以我想用一个断言来传达这一点:
但我发现它不完整且容易出错,因为它可能会超出空终止字符串的范围。
有没有办法安全地断言字符串视图确实是空终止的?
c++17 - 如何通过值或常量引用传递 std::string_view
通常string_view
用于这样的函数参数:
哪个更好?
const 引用是 8 个字节,string_view
通常是它的两倍,例如 16 个字节。
但是,如果没有内联或优化,const 引用可能有两个间接 - 一个用于 ref,第二个用于内部指针。
STL是怎么做到的?
c++ - 需要以空结尾的 string_view
std::string_view
在以下场景中使用:
上面的想法很好用,现在 copy-ctor 将默认为noexcept
(这对于异常类型非常有用!) - 并且字符串也在调用站点“验证”。
然而,剩下的事情是语义上 astring_view
不保证为零终止(尽管在这种情况下,我们编写了代码,所以它会是 - 最好是为这种特殊情况保证,就像它只有构造函数一样我们实际使用的。
我正在考虑以下类似的方法是否是一个很好的解决方法?
但我想知道其他人是否有这个问题(以及他们做了什么),或者我是否忽略了一些简单的东西?
c++ - 由给定字符串支持的 string_view
在 C++ 中,假设我从流中提取行,模仿getline()
. 每次我提取一行时,例如使用低级原语,我还想创建一个string_view
由提取的字符串支持的 s 向量。因此,本质上,我的方法将返回一个提取的字符串和一个string_view
由前者支持的 s 向量。如何做到这一点?遵循相关的代码片段:
c++ - 为什么 std::basic_string_view 只支持 const 指针?
根据cppreference.com中的描述:
类模板
basic_string_view
描述了一个对象,该对象可以引用类似对象的连续连续序列,char
该序列的第一个元素位于零位置。
但是,将类模板与非常量指针一起使用可能很有用,char
例如使用标准算法写入以空值结尾的字节字符串。例如,想象一个std::editable_string_view
拥有 a的假设char*
,可以写类似
有理由std::basic_string_view
只支持 const 指针吗?
string - c++17 string_views 上的交换操作似乎缓存效率极低
我一直在努力优化一种专有算法,该算法根据内部索引标准对字符串代码向量进行排序。代码的长度范围为 1 - 32 个字符。该算法执行 std::swap 以将字符串移动到其新位置。
std::swap 在 std::string 上重载,应该对底层字符串执行移动,但分析似乎显示交换正在执行复制而不是移动,perf 的报告显示
我尝试使用 std::string 交换方法并强制移动,即
但他们没有任何区别,基准测试始终显示该算法需要 2 秒以上才能对大约 400k 代码字符串进行排序。
更改向量以使用 string_views 最初会产生更好的结果
基准测试显示 string_view 版本在 1 秒内执行相同的排序。
但是,当我尝试使用优化 -O{1,2 或 3} 编译算法时,string_view 版本比 std::string 版本慢两倍。
检查缓存未命中
对于 std::string 非优化版本:
对于 string_view 版本:
对使用 -O2 std::string 版本编译的 algo 版本运行相同的操作:
string_view 版本
为什么 std::swap 和 std::string::swap 复制而不是移动,我错过了什么吗?我读错了性能报告吗?
为什么 std::string_view 的缓存性能这么差?是因为不是交换 len 和 ptr 而是跟随 ptr 然后交换?
为什么优化器无法将 string_view 版本优化到与字符串版本相同的级别。
编译器是 gcc 版本 8.3.0
c++ - 文件到 std::string_view
是否可以将文件直接加载到 std::string_view 中?
直接 = 不从 stringstream 创建代理 std::string。
它会使我的很多代码更快。