在我的应用程序中,有一部分需要我制作一个容器的拷贝。目前我使用 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 它的大小。我该怎么做?
谢谢。
最佳答案
您必须实际
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.:您可能在
my_struct
中有一个非平凡的默认构造函数.删除它,或插入一个简单的(空的)默认构造函数来加快速度(避免构造许多您从未使用过的元素)。如果
my_struct
包含非 POD 数据成员(如std::string
)你不能使用memcpy()
完全没有。
(旁注:你很少想调用 reserve()
。vector
以这样一种方式维护自己的内部存储,即总是按指数分配比实际需要更多的分配,以避免在频繁追加时频繁调整大小/复制元素。)
resize()
不是一个缓慢的操作。它与任何内存分配一样快。
是否 my_struct
有一个不平凡的默认构造函数?删除它并手动进行初始化。这可能就是你说 resize()
的原因是慢的。它实际上会构建你的对象。但是既然你显然可以 memcpy()
您的对象可能可以通过一个简单的(空的)默认构造函数逃脱。
关于c++ - 如何手动分配 vector 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54445480/