Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何手动分配向量';s码?_C++_Vector_Memcpy - Fatal编程技术网

C++ 如何手动分配向量';s码?

C++ 如何手动分配向量';s码?,c++,vector,memcpy,C++,Vector,Memcpy,在我的应用程序中,有一部分要求我复制一个容器。目前我使用的是STD::vector(但是可以考虑使用其他东西)。应用程序对延迟非常敏感。所以,我在寻找一种尽可能快地复制向量的方法。我发现memcpy做得比其他任何东西都好。但是,它不会更改向量的内部大小。也就是说,vector.size()仍然会给我0 我知道我的路有多滑。我不介意扔掉安全检查单。我知道有多少元素被复制。我不想使用vector.resize()更改目标向量的大小(这是一个缓慢的操作) 问题: std::vector<my_s

在我的应用程序中,有一部分要求我复制一个容器。目前我使用的是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);
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
    any
    my_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
    有一些特殊含义,而不是