可以使用旧块获取并初始化一个新的,可能更大的块,然后使用旧块 被释放。
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 ;
还有其他方法可以完成这项工作,有效?
答案 0 :(得分:9)
使用std::vector<Object>
。它会自动为您完成此操作。
答案 1 :(得分:3)
你需要问自己的第一件事是你需要重新分配吗?你需要一个连续的缓冲区吗?
是的,std::vector
将为您实现它,但如果您实际上不必拥有连续的缓冲区,则可以使用std::deque
,它不会重新分配,并且可能会更有效地使用我们的内存资源。
您应该考虑的下一件事是与交换对象相比,复制对象的成本。这完全取决于对象的实现。 (如果交换需要3个分配,那么它显然效率不高,但如果副本很深,那么交换可能更有效。)
注意:std::deque
根本不会重新分配,因此如果您正在使用它,则无需担心。
答案 2 :(得分:1)
您可以使用自定义分配器,如对象池或内存竞技场,您可以从堆中预先分配块,然后根据自定义策略将它们分开。
答案 3 :(得分:1)
要回答您的问题,可以提高此操作的效率。当此逻辑迁移到C ++ 0x时,对于许多重要的用例,可以使大大更高效。 vector
封装了这种逻辑,以及最有效的技术。您是否想要了解矢量是如何做到的?如果是这样,请问,我很乐意解释。