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

时间:2019-01-30 16:44:43

标签: c++ vector memcpy

在我的应用程序中,有一部分需要我复制容器。目前,我使用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大小是多少。我该怎么做?

谢谢。

3 个答案:

答案 0 :(得分:3)

  1. 必须实际使用resize() memcpy()向量,然后再使用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()

    所有这些变体都将比您的my_struct变体快甚至快。如果您遇到速度慢的情况,请参阅2。:

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

  3. 如果std::string包含非POD数据成员(如memcpy()),则根本无法使用reserve()

(旁注:您很少想调用vectorresize()保持自己的内部存储,以这种方式总是分配成倍于实际需要的容量,从而避免频繁调整大小/频繁添加元素时进行复制。)

my_struct并非缓慢的操作。它与任何内存分配一样快。

resize()是否具有非平凡的默认构造函数?删除它并手动进行初始化。这可能就是您说memcpy()缓慢的原因。它实际上将构造您的对象。但是,既然您显然可以node您的对象,那么您可能可以摆脱一个琐碎的(空的)默认构造函数。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

  

如何手动分配矢量大小?

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

  

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

上面提到的代码具有未定义的行为,因此执行此操作无关紧要。

一种简单有效的复制载体的方法是:

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