我的代码中有一个热点,我需要调用一个带vector<char> vec
的库函数,我的数据为char* data
,长度为size_t len
。我现在这样做:
vec.reserve(len);
std::copy(data, data+len, back_inserter(vec));
和我说的这是一个热点。我想知道一次复制一个字节是否太慢,并且在每次迭代中复制4或8个字节会更快。我也不知道有一种方法可以用这种方式填充向量(因为它需要写入data()
成员)。
是否有办法完全避免副本?
答案 0 :(得分:8)
你可以做到
vec.assign(data, data + len);
或者如果它是一个新变量,请使用适当的构造函数:
std::vector<char> vec(data, data + len);
它应该比push_back()
一个一个更有效率(尽管如此),但无论如何它都是副本。
除非您从一开始就使用vector<char>
作为数据,否则您无法避免复制。或者更改库代码。
至少,您可以在对库的调用之间重用vec
(通过调用assign
),这样可以节省一些内存分配时间。
答案 1 :(得分:0)
vec.swap( std::vector<char>(data, data + len) );
这将创建一个内容为data
的新临时(匿名)矢量对象,并用此内容替换vec。
确保在部署之前使用其他替代方案对其进行概要分析。还要问自己,确保使用std::vector
而非std::string
或其他内容。
一种愚蠢的方式是:
vec.resize(len);
std::memcpy(&vec[0], data, len); // include <cstring>
memcpy
可能会使用本机汇编指令一次复制多个字节,并且应该更快。