矢量重新分配然后分配可以提高性能

时间:2016-11-17 14:06:18

标签: c++ vector

如果必须将char数组赋值给vector,首先保留向量大小然后为其赋值数是不错的做法?

这会改善表现吗?

beacuse编译器不需要在内部分配几次,所以它应该提高性能,但我不确定。 在分配之前,分配是否已考虑到这一点?

doese assign(reserve)首先分配大小然后插入/复制?

注意:-with赋值i表示向量中的赋值函数(std :: vector :: assign)

例如: -

${__javaScript("${type}" != "reports" && ${counter} < 300;)}

2 个答案:

答案 0 :(得分:4)

可能。

可能。

测试并查看。

答案 1 :(得分:1)

我不确定为什么这个问题得到了贬低,因为对于有人问这个问题似乎是完全有效的,而不是离开并发明某种方式来对基准向量进行测量,这可能会或可能不会给出错误的结果。

无论如何......如果你有一个相当大的数组,你将要分配给向量,那么在分配之前保留()几乎肯定会更快。然而,有几个警告意味着可能并非总是如此。实际上,它可能依赖于实现。

您的矢量在创建时将具有预定义的大小,因此当执行assign()时,它将开始将数组元素复制到矢量中。当向量达到其容量时,它将进行另一次分配(我认为1.5x或可能是2x分配策略)并将元素从一个向量复制到另一个向量。但是,此分配 可能 实际上会扩展内存(取决于操作系统是否允许它),并且可能不会执行此复制操作。你无法预测到这一点,因为根本不在你的控制之下。

如果您的输入数组是已知大小,那么通常最好提前保留()您需要的空间,以避免这些可能的重新分配/复制操作。但是,你可以比这更好一步。向量构造函数采用一个参数,允许您在实例化时指定大小。这样就可以避免首先保留()。 (请注意,您需要了解resize()和reserve()之间的区别,一个只影响容量,另一个创建指定大小的矢量)

你需要注意的事实是,如果你创建一个指定大小的向量,那么向量的size()将具有该大小,即使你插入的元素少得多。 (您将使用operator []访问和插入元素)

您应该问自己的另一个问题是:如果您已将数据包含在数组中,那么将其移动到动态容器中的目的是什么?您真的需要吗?