我有一个 std::vector<std::uint8_t>
,需要复制。这只需调用复制构造函数即可完成。
我的分析结果显示,Microsoft Visual C++ (msvc100) 实现使用 std::uninitialized_copy
内部。这将一个接一个地复制每个元素。在这种情况下,可以通过一次复制整个内存块来完成更优化的复制(例如 memcpy
可能会这样做)。
换句话说,这可能是一个重要的优化。有没有办法强制 vector 使用这种优化的方法?
注意:我尝试过使用 std::basic_string<std::uint8_t>
,它的性能确实更好,但它还有其他问题。
最佳答案
此答案并非特定于 msvc100。
如果你使用像 in 这样的复制构造函数
std::vector<uint8_t> newVect(otherVect);
otherVect 的分配器对象也必须被复制(和使用),这需要付出更多努力才能使其在 STL 实现中发挥作用。
如果你只想复制otherVect的内容,使用
std::vector<uint8_t> newVect(otherVect.begin(), otherVect.end());
它使用 newVect 的默认分配器。
另一种可能是
std::vector<uint8_t> newVect; nevVect.assign(otherVect.begin(), otherVect.end());
在这种情况下,所有这些(包括当 otherVect 使用默认分配器时的复制构造函数)都应该归结为一个好的 STL 实现中的 memmove/memcpy。请注意,otherVect 与 newVect 具有完全相同的元素类型(例如“char”或“int8_t”)。
使用容器的方法通常比使用通用算法的性能更高,因此结合使用 vector::resize() 和 std::copy() 甚至 memmove()/memcpy() 将是一种解决方法,如果供应商没有充分优化容器。
关于c++ - 快速复制 `std::vector<std::uint8_t>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964469/