如何手动分配矢量的大小?
How to manually assign vector's size?
在我的应用程序中,有一个部分需要我制作容器的副本。目前我使用 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它的大小。我该怎么做?
谢谢。
memcpy()
将内容复制到向量之前,您必须实际resize()
向量: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()
对象,因此您可能可以使用一个琐碎(空)的默认构造函数。
如何手动分配矢量的大小?
你不能。您只能通过添加或删除元素(例如插入、清除、调整大小等)的修改函数来修改矢量的大小。
在上面的代码之后,我需要告诉我destination_vector它的大小。我该怎么做?
上面提到的代码具有未定义的行为,因此在它之后做什么并不重要。
复制向量的一种简单有效的方法是:
std::vector<my_struct> destination_vector(original_vector);
您的代码段具有未定义的行为,即使您有reserved
空间,也无法memcpy
到空向量中。如果memcpy
任何my_struct
对象不是 TriviallyCopyable 类型,它也可能是未定义的行为。
您可以直接将向量构造为源的副本。您的编译器很可能会发出与原始代码段相同(或更快)的代码,如果my_struct
代码段是 TriviallyCopyable。
std::vector<my_struct> destination_vector(original_vector.begin(), original_vector.begin() + container_length);
- 将数组的地址分配给变量并删除
- 在C++中手动调整数组大小
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- C++ 手动分配和初始化对象
- 我可以在不手动将它们分配在堆上的情况下存储iostreams集合
- 如何手动分配矢量的大小?
- 为静态分配的变量手动调用析构函数
- 在 c++ 中手动重新分配对象数组
- 为每个连接手动分配端口号
- 是否有一种方法可以选择我想要分配的一个实例的成员,而无需手动分配它们
- 我们能否确定数据点是否手动分配
- 我应该使用手动分配来允许移动语义
- C++:是否绝对有必要手动分配内存
- 可以使用std::vector capacity/size/rereserve手动管理向量内存分配吗