从 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
可能会使用本机汇编指令一次复制多个字节,应该会更快。
我的代码中有一个热点,我需要调用一个采用 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
可能会使用本机汇编指令一次复制多个字节,应该会更快。