如何手动分配矢量的大小?

How to manually assign vector's size?

本文关键字:何手动 分配      更新时间:2023-10-16

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

我知道我走的是一条多么滑溜溜的道路。我不介意扔掉安全检查。我确实知道有多少元素正在被复制。我不想使用 vector.resize() 来更改目标矢量的大小(这是一个缓慢的操作)。

问题:

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. memcpy()将内容复制到向量之前,您必须实际resize()向量:

    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()对象,因此您可能可以使用一个琐碎(空)的默认构造函数。

如何手动分配矢量的大小?

你不能。您只能通过添加或删除元素(例如插入、清除、调整大小等)的修改函数来修改矢量的大小。

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

上面提到的代码具有未定义的行为,因此在它之后做什么并不重要。

复制向量的一种简单有效的方法是:

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

您的代码段具有未定义的行为,即使您有reserved空间,也无法memcpy到空向量中。如果memcpy任何my_struct对象不是 TriviallyCopyable 类型,它也可能是未定义的行为。

您可以直接将向量构造为源的副本。您的编译器很可能会发出与原始代码段相同(或更快)的代码,如果my_struct代码段是 TriviallyCopyable。

std::vector<my_struct> destination_vector(original_vector.begin(), original_vector.begin() + container_length);