C++ 如何手动分配向量';s码?
在我的应用程序中,有一部分要求我复制一个容器。目前我使用的是STD::vector(但是可以考虑使用其他东西)。应用程序对延迟非常敏感。所以,我在寻找一种尽可能快地复制向量的方法。我发现memcpy做得比其他任何东西都好。但是,它不会更改向量的内部大小。也就是说,vector.size()仍然会给我0 我知道我的路有多滑。我不介意扔掉安全检查单。我知道有多少元素被复制。我不想使用vector.resize()更改目标向量的大小(这是一个缓慢的操作) 问题:C++ 如何手动分配向量';s码?,c++,vector,memcpy,C++,Vector,Memcpy,在我的应用程序中,有一部分要求我复制一个容器。目前我使用的是STD::vector(但是可以考虑使用其他东西)。应用程序对延迟非常敏感。所以,我在寻找一种尽可能快地复制向量的方法。我发现memcpy做得比其他任何东西都好。但是,它不会更改向量的内部大小。也就是说,vector.size()仍然会给我0 我知道我的路有多滑。我不介意扔掉安全检查单。我知道有多少元素被复制。我不想使用vector.resize()更改目标向量的大小(这是一个缓慢的操作) 问题: std::vector<my_s
std::vector<my_struct> destination_vector;
destination_vector.reserve(container_length);
std::memcpy(destination_vector.data(), original_vector.data(), sizeof(my_struct)*container_length);
std::vector destination\u vector;
目的地向量保留(容器长度);
std::memcpy(destination_vector.data()、original_vector.data()、sizeof(my_struct)*容器长度);
在上面的代码之后,我需要告诉我的目标向量它的大小。我该怎么做
多谢各位
memcpy()
将内容复制到向量之前,必须实际resize()
:
destination\u vector.resize(容器长度)代码>
但最好首先避免使用memcpy()
,并使用机制复制vector
提供的vector
内容,如其他答案所示:
std::向量目的地向量(原始向量)代码>
或者如果目标向量实例已经存在:
destination_vector.insert(destination_vector.begin()、original_vector.begin()、original_vector.end)代码>
或者,如果您不再需要原始内容,则以最快的速度:
destination_vector.swap(原始_vector)代码>
所有这些变体都将与您的memcpy()
变体一样快,甚至更快。如果您遇到缓慢,请参见第2条:
my\u struct
中有一个非常重要的默认构造函数。删除它,或者插入一个普通的(空的)默认构造函数以加快速度(避免构造许多您从未使用过的元素)my_struct
包含非POD数据成员(如std::string
),则根本无法使用memcpy()
reserve()
。向量
以这样一种方式维护自己的内部存储,即总是以指数方式分配比实际需要更多的内存,以避免在频繁追加元素时频繁调整大小/复制。)
resize()
不是一个缓慢的操作。它与任何内存分配一样快
my_struct
是否有一个非平凡的默认构造函数?删除它并手动进行初始化。这可能就是您说resize()
速度慢的原因。它将实际构造您的对象。但是,由于您显然可以memcpy()
您的对象,因此您可能可以使用一个微不足道的(空的)默认构造函数。您的代码段具有未定义的行为,因此您不能memcpy
进入一个空向量,即使您有保留的空间。如果memcpy
anymy_struct
对象不是一个类型,那么它也可能是未定义的行为
可以直接将向量构造为源的副本。如果my_struct
是可复制的,那么编译器很可能会发出与原始代码段相同(或更快)的代码
std::vector<my_struct> destination_vector(original_vector.begin(), original_vector.begin() + container_length);
std::vector destination_vector(原始_vector.begin(),原始_vector.begin()+容器长度);
如何手动指定向量的大小
你不能。只能通过添加或删除元素(如插入、清除、调整大小等)的修改功能修改向量的大小
在上面的代码之后,我需要告诉我的目标向量它的大小。我该怎么做
上面提到的代码有未定义的行为,所以在它之后做什么并不重要
复制向量的一种简单有效的方法是:
std::vector<my_struct> destination_vector(original_vector);
std::向量目的地向量(原始向量);
我会仔细检查文档,vector有一个名为resize的方法它是一个慢操作有多慢?你们测量过了吗?若你们做对了,编译器已经使用了memcpy
。。。心灵调试:my_struct
不是一种简单的类型,因此任何使用memcpy
的行为都是UB,编译器试图从自身保存OP。@PaulSanders如果resize小于以前的大小,则不允许重新分配向量。我感谢您的及时回复。但是,我特别提到,就延迟而言,调整大小对我来说是不可容忍的。@Aleksey它仍然是必需的。任何更改大小的操作都将(以某种方式)初始化添加的元素。“通常不需要调用reserve()。”这不是真的<当您知道在仍然使用推回
、放置
或以其他方式一次添加一个元素时将插入多少元素时,代码>保留
非常有用,特别是使用std::back\u inserter
。@Francois:是的,它在特殊情况下非常有用。但是,在您的示例中,没有必要事先调用reserve()
,因为vector
使用指数增长。因此,一次添加一个元素仍然具有线性复杂性。可能是由于我的构造函数的原因,调整大小看起来很慢。我必须创建它,以便将我的结构放置到向量中。构造函数被称为平凡的标准是什么?吹毛求疵:这假设container\u length==original\u vector.size()
。“我希望是这样,这比我的变体更好。”Caleth说得有道理。这是如何复制向量/容器的答案。如果container\u length
有一些特殊含义,而不是