从const char * + length构造const std :: string是否便宜?

时间:2016-04-12 13:59:53

标签: c++ string performance c++-standard-library construct

执行费用

const std::string s(my_const_char_ptr, my_length);

?是否涉及复制?如果没有,我可以从典型的标准库实现中获得多少指令?在性能关键代码中几乎没有这个?

...或者我必须获得GSL实施并使用string_view吗?

3 个答案:

答案 0 :(得分:5)

如果您想知道确切的答案,则需要在目标系统和编译设置上进行测量。但是对于幕后发生的事情:

  • 如果my_length足够大(或标准库的std::string实施不使用小字符串优化 - 这很少见),那么将会有一个动态内存分配。

  • 在任何情况下,都会有一个从*my_const_char_ptrstd::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是传递给函数的大小。