2010-04-27 71 views
0

IDE再分配 - Visual Studio 2008中时,Visual C++矢量确实每个的push_back

  1. 我有一个自定义类的Class1用拷贝构造函数给它。
  2. 我也有一个矢量
  3. 数据插入使用下面的代码
Class1* objClass1; 
vector<Class1> vClass1; 

for(int i=0;i<1000;i++) { 

    objClass1 = new Class1(); 
    vClass1.push_back(*objClass1); 
    delete objClass1; 

}

现在在每次插入,向量被重新分配和所有现有的内容都被复制到新的位置。例如,如果向量有5个元素,如果我插入第6之一,随着新一个沿前5个元素被复制到新的位置(我想通了由复制构造函数添加日志语句。)

使用储备(),然而,这并不如预期发生!我有以下问题

  1. 是否必须始终使用保留语句?
  2. 矢量是否做了重新分配每次我做一个的push_back时间;或者它发生,因为我调试
+1

在一个不相关的音符,它会更容易,更有效,只是'vClass1.push_back(1类());',没有任何的堆内存分配。 – doublep 2010-04-27 20:01:50

回答

1

找出把你的拷贝构造函数测试到非调试代码,并让我们知道你会得到什么你平台!海事组织矢量不应该在每次推迟时重新分配。有更聪明的方法来管理内存,我敢打赌,实施者没有这样做。

2
  1. 这不是强制性的,这是一个优化,因为重新分配是昂贵的。
  2. 我认为这是一个实现细节是不是经常重新分配。我认为向量在每次重新分配时加倍存储是正常的,但正如我所说的,这可能因实现而有所不同。 (这可能是因为你在调试版本它重新分配往往比正常的情况。)
+0

@ jwismar:不,他的记忆处理很好。 Vector将包含'* objClass1'的*副本*,因此删除原始文件是完全合法的。 – doublep 2010-04-27 19:54:19