2016-04-12 64 views
1

有多贵是它来执行从const char * +长度构造一个const std :: string便宜吗?

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

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

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

+0

从的FreeStore分配内存是somewh几乎所有的C++实现都价格昂贵。除此之外,你的问题非常模糊,以至于你可能期望的最准确的答案是:这取决于。 – IInspectable

+0

是的,正在复制。而且没有办法说出这样的操作会使用多少“指令”。你只需要反汇编你的代码,然后看看。 –

+1

构造函数会执行堆分配(除非'my_length'足够小并且实现执行小型字符串优化),然后复制字符数据。 –

回答

4

有多贵是它来执行

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

这是一个内存分配(如果my_length很大,可能是动态的)+一个O(n)副本。如果你想确切地知道你需要在目标系统和编译设置上进行测量。

是否涉及复制?

是的。需要将字符复制到std::string的内部缓冲区。

1

每标准表66

basic_string(const charT*, size_type, const Allocator&)效果

data():在其第一元件由s [...]

指出在阵列的所分配的复制的第一个元素分

所以我们要分配一个O(N)副本,其中N是传递给函数的大小。

2

有多贵是它来执行......

,如果你做一次

相当便宜?涉及复制吗?

是的,但这是你最不顾虑的。线性副本是关于您在现代建筑中可以做的最便宜的事情。 (因为流水线,预取等等)

我可以从典型的标准库实现中得到多少指令?

比您想象的要少 - 特别是在复制部分。实现(使用-O2构建)将尝试在可能的情况下一次循环展开,矢量化并传输较大的单词。内存对齐实际上是性能最大的仲裁者。

几乎没有足够的这样的性能关键代码?

如果它的性能关键,预先分配的字符串并重新使用它(见std::string::assign(first, last)。同样,复制位的芯片便宜,它是内存分配,这会杀了你,所以做一次。

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

不除非字符串是绝对巨大的。

+0

只要字符串很短(比如在128B下),是的复制是便宜的。如果这种情况发生在紧密的循环中,目标缓冲区在L1缓存中已经很热。避免复制仍然显然是更好的,因为它需要指令来完成。如果循环足够大,OP不能直接改变循环来使用'const char *',那么可能就足够了,它不会妨碍指令/ uop吞吐量(例如,Intel SnB系列的4每时钟的管道宽度),所以复制延迟/吞吐量影响大部分是隐藏的。 –

相关问题