将原始字节数组复制到空字节向量中的最有效方法

新手上路,请多包涵

我有一个场景,我需要将原始动态分配的 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 这需要将内存清零,所以我想它会减慢一点..

另外,还有什么其他建议吗?

原文由 mk33 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 558
1 个回答

如果您不需要在复制之前创建向量,您始终可以将原始数组传递给向量的构造函数:

 std::vector<uint8_t> myVector(myRawArray, myRawArray + byteCount);

如果您确实需要事先构造向量,则可以选择以下方法:

 std::vector<uint8_t> myVector;
// ... do some stuff ...
// Now, we're ready for the copy, and byteCount is known.
myVector.reserve(byteCount);
std::copy(myRawArray, myRawArray + byteCount, std::back_inserter(myVector));

我建议使用 std::copy 除非 memcpy 被证明更快。 std::copy 在 C++ 代码中更安全、更惯用,但如果确实证明它更快,请不要害怕使用 memcpy。速度差异很可能会随着不同的编译器而改变。

我希望这有帮助。

原文由 Ryan McCleary 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题