从char *

时间:2015-04-30 07:12:58

标签: c++ vector stl

我的代码中有一个热点,我需要调用一个带vector<char> vec的库函数,我的数据为char* data,长度为size_t len。我现在这样做:

vec.reserve(len);
std::copy(data, data+len, back_inserter(vec));
和我说的这是一个热点。我想知道一次复制一个字节是否太慢,并且在每次迭代中复制4或8个字节会更快。我也不知道有一种方法可以用这种方式填充向量(因为它需要写入data()成员)。

是否有办法完全避免副本?

2 个答案:

答案 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可能会使用本机汇编指令一次复制多个字节,并且应该更快。