c++ - 如何手动分配 vector 的大小?

标签 c++ vector memcpy

在我的应用程序中,有一部分需要我制作一个容器的拷贝。目前我使用 std::vector (但可能会考虑使用其他东西)。该应用程序对延迟非常敏感。所以,我一直在寻找一种方法来尽可能快地复制 vector 。我发现 memcpy 比其他任何东西都做得更好。但是,它不会改变 vector 的内部大小。 IE。 vector.size() 仍然会给我 0。

我知道我走的路有多滑。我不介意放弃安全检查。我知道有多少元素被复制了。我不想使用 vector.resize() 来更改目标 vector 的大小(这是一个缓慢的操作)。

问题:

std::vector<my_struct> destination_vector;
destination_vector.reserve(container_length);
std::memcpy(destination_vector.data(), original_vector.data(), sizeof(my_struct)*container_length);

在上面的代码之后,我需要告诉我的 destination_vector 它的大小。我该怎么做?

谢谢。

最佳答案

  1. 必须实际resize()使用 memcpy() 将内容复制到它之前的 vector :

    destination_vector.resize(container_length);

    但最好避免使用 memcpy()首先并使用机制复制vector vector 提供的内容,正如其他答案中所建议的那样:

    std::vector<my_struct> destination_vector(original_vector);

    或者如果 destination_vector实例已经存在:

    destination_vector.insert(destination_vector.begin(), original_vector.begin(), original_vector.end);

    或者,如果您不再需要原始内容,则最快:

    destination_vector.swap(original_vector);

    所有这些变体都将与您的 memcpy() 一样快,甚至更快变种。如果您遇到缓慢,请参阅 2.:

  2. 您可能在 my_struct 中有一个非平凡的默认构造函数.删除它,或插入一个简单的(空的)默认构造函数来加快速度(避免构造许多您从未使用过的元素)。

  3. 如果 my_struct包含非 POD 数据成员(如 std::string )你不能使用 memcpy()完全没有。

(旁注:你很少想调用 reserve()vector 以这样一种方式维护自己的内部存储,即总是按指数分配比实际需要更多的分配,以避免在频繁追加时频繁调整大小/复制元素。)

resize()不是一个缓慢的操作。它与任何内存分配一样快。

是否 my_struct有一个不平凡的默认构造函数?删除它并手动进行初始化。这可能就是你说 resize() 的原因是慢的。它实际上会构建你的对象。但是既然你显然可以 memcpy()您的对象可能可以通过一个简单的(空的)默认构造函数逃脱。

关于c++ - 如何手动分配 vector 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54445480/

相关文章:

c++ - EOF,读取最后一行时永远循环。 C++

c++ - 为什么我的 vector 需要一个常量值?

c++ - Release模式下迭代器的绑定(bind)检查 (c++)

c - 在 C "invalid operands to binary expression (' size_t'(又名 'unsigned long' )和 'char *' )中重新创建 strlcat 函数”

使用 memcpy 连接两个 int 数组

C++ 多态性。为什么这是有效的?

c++ - 为什么在 C++ 类中的成员变量上使用前缀

c++ - 在私有(private)类语法中复制构造函数

c++ - 在c++中的 vector 中推回多种类型的数据

c - 使用 memcpy() 进行结构复制是否合法?