以有效的方式重新分配内存

时间:2011-02-24 12:10:51

标签: c++

可以使用旧块获取并初始化一个新的,可能更大的块,然后使用旧块 被释放。

purpose of that code ; reallocating the old memory area with new size

typeName is  Object 

Object *oldArray = objects ; // objects is pointer to old data block 
objects = new Object[ newCapacity ] ;
for ( int k = 0; k < theSize ; k++ ) 
    objects [k] = oldArray [k] ;
... // some other thing 
delete [] oldArray ;

还有其他方法可以完成这项工作,有效

4 个答案:

答案 0 :(得分:9)

使用std::vector<Object>。它会自动为您完成此操作。

答案 1 :(得分:3)

你需要问自己的第一件事是你需要重新分配吗?你需要一个连续的缓冲区吗?

是的,std::vector将为您实现它,但如果您实际上不必拥有连续的缓冲区,则可以使用std::deque,它不会重新分配,并且可能会更有效地使用我们的内存资源。

您应该考虑的下一件事是与交换对象相比,复制对象的成本。这完全取决于对象的实现。 (如果交换需要3个分配,那么它显然效率不高,但如果副本很深,那么交换可能更有效。)

注意:std::deque根本不会重新分配,因此如果您正在使用它,则无需担心。

答案 2 :(得分:1)

您可以使用自定义分配器,如对象池或内存竞技场,您可以从堆中预先分配块,然后根据自定义策略将它们分开。

答案 3 :(得分:1)

要回答您的问题,可以提高此操作的效率。当此逻辑迁移到C ++ 0x时,对于许多重要的用例,可以使大大更高效。 vector封装了这种逻辑,以及最有效的技术。您是否想要了解矢量是如何做到的?如果是这样,请问,我很乐意解释。