可变大小的char数组,最小化对new的调用?

时间:2012-05-11 23:55:14

标签: c++

我需要一个动态改变大小的char数组。我不知道它有多大,所以预分配不是一种选择。它一次永远不会超过20个字节,下次它可能达到5kb ......

我希望分配就像一个标准向量。

我想过使用标准向量< char>但所有这些后退似乎都浪费时间:

strVec.clear();
for(size_t i = 0; i < varLen; ++i)
{
   strVec.push_back(0);
}

这是我能做的最好吗?还是有办法一次向矢量添加一堆物品?或者也许是一种更好的方法。

由于

4 个答案:

答案 0 :(得分:3)

每次拨打std::vector时,

push_back都不会分配内存,但只有当大小超过容量时才会分配内存

答案 1 :(得分:2)

首先,在您分析代码并确定存在瓶颈之前不要进行优化。通过巧妙地做一些事情来考虑可读性,可访问性和可维护性的成本。确保您采取的任何计划不会妨碍您将来使用Unicode。还在?好的。

正如其他人所提到的,矢量保留的内存比最初使用的内存多,而push_back通常非常便宜。

然而,有些情况下使用push_back会重新分配内存。例如,对myvector.push_back()的一百万次调用可能会触发myvector的10或20次重新分配。另一方面,在其末端插入向量将导致myvector *的最多1次重新分配。出于速度和可读性的原因,我通常更喜欢将插入习惯用于reserve / push_back习语。

myvector.insert(myvector.end(), inputBegin, inputEnd)

如果您事先不知道字符串的大小并且不能容忍重新分配造成的打嗝,可能是因为硬实时约束,那么也许您应该使用链表。链表将以平均性能差得多的价格具有一致的性能。

如果所有这些都不足以满足您的目的,请考虑其他数据结构,例如rope或回复更多有关您案例的详细信息。

  • 来自Scott Meyer的有效STL,IIRC

答案 2 :(得分:1)

您可以使用resize成员函数添加一堆。但是,我不希望push_back变慢,特别是如果向量的内部容量已经非常重要。

答案 3 :(得分:1)

  

这是我能做的最好吗?还是有办法一次向矢量添加一堆物品?或者也许是一种更好的方法。

push_back不是很慢,它只是将大小与当前容量进行比较,并在必要时重新分配。由于CPU上的分支预测和超标量执行,比较可能基本上为零时间。重新分配执行O(log N)次,因此向量使用的内存最多为所需内存的两倍,但重新分配所花费的时间很少会增加任何内容。

要一次插入多个项目,请使用insert。有一些重载,唯一的技巧是你需要明确传递end

my_vec.insert( my_vec.end(), num_to_add, initial_value );
my_vec.insert( my_vec.end(), first, last ); // iterators or pointers

对于第二种形式,您可以先将值放在数组中,然后将数组复制到向量的末尾。但这可能会增加复杂性。这就是微优化的方式。如果您知道可以获得可衡量的收益,则只尝试进行优化。