从 char* 高效实例化 vector<char>

Efficiently instantiate vector<char> from char*

我的代码中有一个热点,我需要调用一个采用 vector<char> vec 的库函数,并且我将数据作为 char* data 以及 size_t len 长度.我目前做的:

vec.reserve(len);
std::copy(data, data+len, back_inserter(vec));

就像我说的,这是一个热点。我想知道一次复制一个字节是否太慢,每次迭代复制 4 或 8 个字节会更快。我也不知道有一种方法可以用这种方式填充向量(因为它需要写入其 data() 成员)。

有没有办法完全避免复制?

你可以做到

vec.assign(data, data + len);

或者如果它是一个新变量,使用适当的构造函数:

std::vector<char> vec(data, data + len);

它应该比 push_back() 一个一个地效率更高一点(尽管进行了配置),但无论如何它是一个副本。

您无法避免复制,除非您从一开始就使用 vector<char> 作为您的数据,或者更改库代码。

至少,您可以在对库的调用之间重复使用 vec(通过调用 assign),这样可以节省一些内存分配时间。

vec.swap( std::vector<char>(data, data + len) );

这将创建一个新的临时(匿名)矢量对象,其内容为 data 并用该内容替换 vec。

确保在部署之前使用其他替代方案对其进行分析。还要问问自己,确保你使用的是 std::vector 而不是 std::string 或其他东西。


一个 hacky 的方法是:

vec.resize(len);
std::memcpy(&vec[0], data, len); // include <cstring>

memcpy 可能会使用本机汇编指令一次复制多个字节,应该会更快。