执行费用
const std::string s(my_const_char_ptr, my_length);
?是否涉及复制?如果没有,我可以从典型的标准库实现中获得多少指令?在性能关键代码中几乎没有这个?
...或者我必须获得GSL实施并使用string_view
吗?
答案 0 :(得分:5)
如果您想知道确切的答案,则需要在目标系统和编译设置上进行测量。但是对于幕后发生的事情:
如果my_length
足够大(或标准库的std::string
实施不使用小字符串优化 - 这很少见),那么将会有一个动态内存分配。
在任何情况下,都会有一个从*my_const_char_ptr
到std::string
缓冲区的O(n)字符副本。
答案 1 :(得分:2)
执行成本有多贵......
如果你这样做便宜很便宜
?是否涉及复制?
是的,但这是你最不担心的事情。线性副本是关于在现代建筑中可以做的最便宜的事情。 (因为流水线,预取等)
我可以从典型的标准库实现中获得多少指令?
比你想象的要少 - 特别是在复制部分。实现(使用-O2构建)将寻求在可能的情况下一次循环展开,矢量化和传输大字。内存对齐实际上是性能的最大仲裁者。
在性能关键代码中几乎没有这个?
如果它的性能至关重要,请预先分配字符串并重新使用它(参见std::string::assign(first, last)
。再次,复制位与芯片一样便宜。它是内存分配这会杀了你,所以一次。
...或者我必须获得GSL实现并使用string_view吗?
除非琴弦绝对是巨大的。
答案 2 :(得分:1)
按照标准表66
basic_string(const charT*, size_type, const Allocator&)
效果
data()
:指向数组的已分配副本的第一个元素,其第一个元素由s指向 [...]
所以我们将有一个分配和一个O(N)副本,其中N是传递给函数的大小。