问题标签 [std-span]
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++ - 从无符号字符的 std::span 创建 std::string
我正在使用一个 C 库,它使用各种固定大小的unsigned char
数组,没有空终止符作为字符串。
我一直在将它们转换为std::string
使用以下功能:
除了使用之外,它工作正常,reinterpret_cast
需要传递数组大小以及我将数组衰减为指针的事实。我试图避免使用std::span
.
使用的函数std::span
如下所示:
该函数运行良好,使其他一切变得更简单,而无需跟踪 C 数组的大小。但是,通过一些基准测试(使用nanobench)进一步挖掘表明,新功能比经典reinterpret_cast
方法慢很多倍。我的假设是基于 - 的函数中的for
循环是这里的低效率。std::span
我的问题:是否有更有效的方法将固定大小的无符号字符 C 数组从std::span
变量转换为 a std::string
?
编辑:
gcc
基准(-O3 -DNDEBUG -std=gnu++20,nanobench,minEpochIterations=54552558,warmup=100,doNotOptimizeAway)
相对的 | ns/op | 运算/秒 | 呃% | 插入/操作 | 胸罩/手术 | 错过% | 全部的 | uchar[] 到 std::string |
---|---|---|---|---|---|---|---|---|
100.0% | 5.39 | 185,410,438.12 | 0.3% | 80.00 | 20.00 | 0.0% | 3.56 | uchar |
2.1% | 253.06 | 3,951,678.30 | 0.6% | 4,445.00 | 768.00 | 0.0% | 167.74 | ucharspan |
1,244.0% | 0.43 | 2,306,562,499.69 | 0.2% | 9.00 | 1.00 | 0.0% | 0.29 | ucharspan_barry |
72.8% | 7.41 | 134,914,127.56 | 1.3% | 99.00 | 22.00 | 0.0% | 4.89 | uchar_bsv |
clang
基准(-O3 -DNDEBUG -std=gnu++20,nanobench,minEpochIterations=54552558,warmup=100,doNotOptimizeAway)
相对的 | ns/op | 运算/秒 | 呃% | 插入/操作 | 胸罩/手术 | 错过% | 全部的 | uchar[] 到 std::string |
---|---|---|---|---|---|---|---|---|
100.0% | 2.13 | 468,495,014.11 | 0.2% | 14.00 | 1.00 | 0.0% | 1.42 | uchar |
0.8% | 251.74 | 3,972,418.54 | 0.2% | 4,477.00 | 767.00 | 0.0% | 166.30 | ucharspan |
144.4% | 1.48 | 676,329,668.07 | 0.1% | 7.00 | 0.00 | 95.8% | 0.98 | ucharspan_barry |
34.5% | 6.19 | 161,592,563.70 | 0.1% | 80.00 | 24.00 | 0.0% | 4.08 | uchar_bsv |
(uchar_bsv
在基准测试中与 相同ucharspan_barry
,但使用std::basic_string_view<unsigned char const>
参数而不是std::span<unsigned char const>