相关疑难解决方法(0)

动态分配的阵列的理想增长率是多少?

C++有std :: vector,Java有ArrayList,许多其他语言都有自己的动态分配数组.当动态数组空间不足时,它会重新分配到更大的区域,旧值将被复制到新数组中.这种阵列性能的核心问题是阵列的大小增长速度.如果你总是只能变得足够大以适应当前的推动,那么你每次都会重新分配.因此,将数组大小加倍,或将其乘以1.5倍是有意义的.

有理想的生长因子吗?2倍?1.5倍?理想上,我的意思是数学上合理,最佳平衡性能和浪费的记忆.理论上,我认识到,鉴于您的应用程序可能具有任何可能的推送分布,这在某种程度上取决于应用程序.但我很想知道是否有一个"通常"最好的值,或者在一些严格的约束条件下被认为是最好的.

我听说有一篇关于这个的文章,但我一直都找不到.

arrays math vector arraylist dynamic-arrays

75
推荐指数
8
解决办法
2万
查看次数

为什么C++分配器中没有重新分配功能?

在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)

c++ memory-management realloc

33
推荐指数
3
解决办法
3829
查看次数

重新分配标准分配器

例如,对于标准分配器接口std::vector,是否支持重新分配?我有一个相当具体的用例,它可以realloc直接比分配,移动和释放更有效.

编辑:抱歉 - 我绝对没有打算调用实际的 realloc,我的意思是一个具有这些语义的函数.实际上,我在后台分配堆栈,如果我从堆栈中分配更多,那么我就无法释放它下面的内存,这是完全浪费,因为无论如何都没有必要再分配,因为有很多可用的连续自由空间.因此,如果我可以被要求在一个步骤中重新分配,那么我可以避免首先,分配一些东西并浪费一些内存,其次,移动所有的内容vector.

c++ c++11

12
推荐指数
1
解决办法
1220
查看次数