【发布时间】:2016-01-01 00:53:08
【问题描述】:
我有一个场景,我需要将原始动态分配的uint8_t 数组的内容复制到一个向量中(保证在这种情况发生时为空)。
vector<uint8_t> myVector;
const uint8_t* myRawArray;
复制操作尽可能高效且可移植(可能使用各种编译器版本)对我来说非常重要。
我想到的一种方法是:
myVector.reserve(byteCount);
myVector.insert(myVector.begin(), myRawArray, myRawArray + byteCount);
关于它的速度与这个相比如何的任何想法:
myVector.resize(byteCount);
memcpy(myVector.data(), myRawArray, byteCount);
我猜memcpy 应该很快,但后来我不得不使用resize,它需要将内存清零,所以我想它会减慢一点..
另外,还有什么建议吗?
【问题讨论】:
-
测量呢?
-
我见过这个问题的几个微妙不同的版本。无论哪种方式都没有太多性能,最快的解决方案因编译器和硬件而异。我可能只是使用插入版本作为其最惯用的 C++。如果我们有特定的硬件和编译器作为目标,那么继续进行测量
-
另一个选项是:
myVector.reserve(byteCount); std::copy(myRawArray, myRawArray + byteCount, std::back_inserter(myVector)); -
你的想法是理智的。测量它们以找出在目标平台上哪一个对您的数据最快。 (但我预计通常接近 nil 差异。)
-
另一种选择,如果可以在复制时声明向量:
std::vector<uint8_t> myVector(myRawArray, myRawArray + byteCount);否则,swap()临时向量:std::vector<uint8_t> tmp(myRawArray, myRawArray + byteCount); myVector.swap(tmp);