我有一个场景,我需要将原始动态分配的uint8_t数组的内容复制到一个向量中(无论何时发生这种情况,都保证为空).
vector<uint8_t> myVector;
const uint8_t* myRawArray;
Run Code Online (Sandbox Code Playgroud)
对我来说非常重要的是复制操作尽可能高效且可移植(可能会使用各种编译器版本).
我想用的一种方法是这样的:
myVector.reserve(byteCount);
myVector.insert(myVector.begin(), myRawArray, myRawArray + byteCount);
Run Code Online (Sandbox Code Playgroud)
关于速度如何与此相比的任何想法:
myVector.resize(byteCount);
memcpy(myVector.data(), myRawArray, byteCount);
Run Code Online (Sandbox Code Playgroud)
我想memcpy应该很快,但后来我被迫使用resize哪个需要将内存清零,所以我猜它会慢一点......
还有,还有其他建议吗?
如果在复制发生之前不需要创建向量,则可以始终将原始数组传递给向量的构造函数:
std::vector<uint8_t> myVector(myRawArray, myRawArray + byteCount);
Run Code Online (Sandbox Code Playgroud)
如果您确实需要事先构造向量,则以下是一个选项:
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));
Run Code Online (Sandbox Code Playgroud)
我建议使用std :: copy,除非memcpy被证明更快.std :: copy在C++代码中更安全,更惯用,但如果真的被证明更快,不要害怕使用memcpy.速度差异很可能会随着不同的编译器而改变.
我希望这有帮助.
memcpy()通常是用汇编语言编写的,并且经过了非常优化,因此您应该知道它memcpy会很快。通常被实现为在后台vector::insert进行调用,但它确实需要检查向量中是否有足够的空间来进行插入而无需任何重新分配。memcpy我还没有对此进行分析,但我敢打赌第一个版本的调用速度reserve更快。
另一种方法是使用std::copy,它被发现比memcpy在某些情况下使用稍快,您可以确定,如果可能的话,它也会调用memcpy或做更好的事情。所以性能问题应该不是问题。它还将负责增加向量的大小以满足您的要求。
| 归档时间: |
|
| 查看次数: |
8301 次 |
| 最近记录: |