c++ - 快速复制 `std::vector<std::uint8_t>`

标签 c++ performance optimization stdvector memcpy

我有一个 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/

相关文章:

performance - 在 Matlab 循环中使用变量做某事比什么都不做更快

jQuery 和 IE8 兼容性 View

javascript - 有什么方法可以监听 Angular 变化检测完成事件

java - Java 中的 2d 子弹游戏

c++ - 检查模板参数是否有成员函数

c++ - 测量使用预编译库(C++、Linux)的程序的总 CPU 时间

ruby-on-rails - 如何调试慢速 Rails 应用程序启动时间?

c++ - SFINAE 检查表达式是否编译并返回 std::true_type

c++ - GLUT程序链接错误

c++ - 优化此功能(在 C++ 中)