我的代码中有一个热点,我需要调用一个带有a的库函数,vector<char> vec我将数据作为char* data一个size_t len长度.我目前这样做:
vec.reserve(len);
std::copy(data, data+len, back_inserter(vec));
Run Code Online (Sandbox Code Playgroud)
就像我说这是一个热点.我想知道一次复制一个字节是否太慢,并且在每次迭代中复制4或8个字节会更快.我也没有意识到有一种方法可以用这种方式填充向量(因为它需要写入其data()成员).
有没有办法可以完全避免副本?
你可以这样做
vec.assign(data, data + len);
Run Code Online (Sandbox Code Playgroud)
或者,如果它是一个新变量,请使用适当的构造函数:
std::vector<char> vec(data, data + len);
Run Code Online (Sandbox Code Playgroud)
它应该比push_back()逐个更有效(虽然配置它),但无论如何它是一个副本.
除非您vector<char>从一开始就使用数据或更改库代码,否则无法避免复制.
至少,您可以vec在对库的调用之间重用(通过调用assign),这样可以节省一些内存分配时间.