有多贵是它来执行从const char * +长度构造一个const std :: string便宜吗?
const std::string s(my_const_char_ptr, my_length);
?涉及复制吗?如果不是,我可以从典型的标准库实现中得到多少指令?几乎没有足够的这个在性能关键的代码?
...或者我必须获得GSL实施并使用string_view
?
有多贵是它来执行从const char * +长度构造一个const std :: string便宜吗?
const std::string s(my_const_char_ptr, my_length);
?涉及复制吗?如果不是,我可以从典型的标准库实现中得到多少指令?几乎没有足够的这个在性能关键的代码?
...或者我必须获得GSL实施并使用string_view
?
有多贵是它来执行
const std::string s(my_const_char_ptr, my_length);
?
这是一个内存分配(如果my_length
很大,可能是动态的)+一个O(n)副本。如果你想确切地知道你需要在目标系统和编译设置上进行测量。
是否涉及复制?
是的。需要将字符复制到std::string
的内部缓冲区。
每标准表66
basic_string(const charT*, size_type, const Allocator&)
效果指出在阵列的所分配的复制的第一个元素分
data()
:在其第一元件由s [...]
所以我们要分配一个O(N)副本,其中N是传递给函数的大小。
有多贵是它来执行......
,如果你做一次
相当便宜?涉及复制吗?
是的,但这是你最不顾虑的。线性副本是关于您在现代建筑中可以做的最便宜的事情。 (因为流水线,预取等等)
我可以从典型的标准库实现中得到多少指令?
比您想象的要少 - 特别是在复制部分。实现(使用-O2构建)将尝试在可能的情况下一次循环展开,矢量化并传输较大的单词。内存对齐实际上是性能最大的仲裁者。
几乎没有足够的这样的性能关键代码?
如果它的性能关键,预先分配的字符串并重新使用它(见std::string::assign(first, last)
。同样,复制位的芯片便宜,它是内存分配,这会杀了你,所以做一次。
...或者我必须获得GSL实施和使用string_view?
不除非字符串是绝对巨大的。
只要字符串很短(比如在128B下),是的复制是便宜的。如果这种情况发生在紧密的循环中,目标缓冲区在L1缓存中已经很热。避免复制仍然显然是更好的,因为它需要指令来完成。如果循环足够大,OP不能直接改变循环来使用'const char *',那么可能就足够了,它不会妨碍指令/ uop吞吐量(例如,Intel SnB系列的4每时钟的管道宽度),所以复制延迟/吞吐量影响大部分是隐藏的。 –
从的FreeStore分配内存是somewh几乎所有的C++实现都价格昂贵。除此之外,你的问题非常模糊,以至于你可能期望的最准确的答案是:这取决于。 – IInspectable
是的,正在复制。而且没有办法说出这样的操作会使用多少“指令”。你只需要反汇编你的代码,然后看看。 –
构造函数会执行堆分配(除非'my_length'足够小并且实现执行小型字符串优化),然后复制字符数据。 –