在我的应用程序中,有一部分需要我复制容器。目前,我使用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大小是多少。我该怎么做?
谢谢。
答案 0 :(得分:3)
您必须实际使用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。:
您可能在my_struct
中拥有一个非平凡的默认构造函数。删除它,或插入一个琐碎的(空的)默认构造函数以加快处理速度(避免构造许多您从未使用过的元素)。
如果std::string
包含非POD数据成员(如memcpy()
),则根本无法使用reserve()
。
(旁注:您很少想调用vector
。resize()
保持自己的内部存储,以这种方式总是分配成倍于实际需要的容量,从而避免频繁调整大小/频繁添加元素时进行复制。)
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);