问题标签 [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.

0 投票
1 回答
99 浏览

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>