【发布时间】:2017-05-18 15:53:36
【问题描述】:
我有一个对std::vector<char> 的引用,我想将它用作接受std::vector<unsigned char> 的函数的参数。我可以不复制吗?
我有以下功能,它可以工作;但是我不确定是否真的发生了副本 - 有人可以帮助我理解这一点吗?是否可以使用std::move 来避免复制或者它已经没有被复制?
static void showDataBlock(bool usefold, bool usecolor,
std::vector<char> &chunkdata)
{
char* buf = chunkdata.data();
unsigned char* membuf = reinterpret_cast<unsigned char*>(buf);
std::vector<unsigned char> vec(membuf, membuf + chunkdata.size());
showDataBlock(usefold, usecolor, vec);
}
我在想我可以写:
std::vector<unsigned char> vec(std::move(membuf),
std::move(membuf) + chunkdata.size());
这是矫枉过正吗?实际发生了什么?
【问题讨论】:
-
std::vector<unsigned char> vec(membuf, membuf + chunkdata.size());复制chunkdata中的数据 -
基于
showDataBlock的名称,也许可以重新设计以采用通用迭代器对 -
@WhiZTiM:不,有第二个重载(未显示)将
std::vector<unsigned char>作为其第三个参数。不过,我确实想知道为什么显示的重载通过非常量引用获取其第三个参数。如果另一个重载也通过非常量引用获取其参数,那么它可能会修改它,并且显示的代码无法将修改从vec复制回chunkdata。 -
@MSalters,this 中的转换是否可能会根据 OP 对该答案的 cmets 的关注而抑制某些优化?
-
@serup - 我再次编辑了标题;如果您仍然认为它没有帮助,您可以随时 edit 您自己的帖子。
标签: c++ stdvector reinterpret-cast