C++有std :: vector,Java有ArrayList,许多其他语言都有自己的动态分配数组.当动态数组空间不足时,它会重新分配到更大的区域,旧值将被复制到新数组中.这种阵列性能的核心问题是阵列的大小增长速度.如果你总是只能变得足够大以适应当前的推动,那么你每次都会重新分配.因此,将数组大小加倍,或将其乘以1.5倍是有意义的.
有理想的生长因子吗?2倍?1.5倍?理想上,我的意思是数学上合理,最佳平衡性能和浪费的记忆.理论上,我认识到,鉴于您的应用程序可能具有任何可能的推送分布,这在某种程度上取决于应用程序.但我很想知道是否有一个"通常"最好的值,或者在一些严格的约束条件下被认为是最好的.
我听说有一篇关于这个的文章,但我一直都找不到.
在C中,标准内存处理函数是malloc(),realloc()和free().但是,C++ stdlib分配器只兼容其中两个:没有重新分配功能.当然,不可能完全相同realloc(),因为简单地复制内存不适合非聚合类型.但是,这个函数是否会出现问题:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
Run Code Online (Sandbox Code Playgroud)
哪里
ptr先前为num_now对象分配了相同的分配器;num_requested> = num_now;和语义如下:
ptr从给定num_now对象的大小扩展给定的内存块num_requested,它会这样做(留下额外的内存未初始化)并返回true;false.当然,这不是很简单,但据我所知,分配器主要用于容器和容器的代码通常很复杂.
给定这样的函数,std::vector比如说,可以增长如下(伪代码):
if (allocator.reallocate (buffer, capacity, new_capacity))
capacity = new_capacity; // That's all we need to do
else
... // Do the standard reallocation by using a different buffer,
// copying data and freeing the current one …Run Code Online (Sandbox Code Playgroud) 例如,对于标准分配器接口std::vector,是否支持重新分配?我有一个相当具体的用例,它可以realloc直接比分配,移动和释放更有效.
编辑:抱歉 - 我绝对没有打算调用实际的 realloc,我的意思是一个具有这些语义的函数.实际上,我在后台分配堆栈,如果我从堆栈中分配更多,那么我就无法释放它下面的内存,这是完全浪费,因为无论如何都没有必要再分配,因为有很多可用的连续自由空间.因此,如果我可以被要求在一个步骤中重新分配,那么我可以避免首先,分配一些东西并浪费一些内存,其次,移动所有的内容vector.