在 C 中,标准内存处理函数是malloc()
, realloc()
and free()
。然而,C++ stdlib 分配器仅并行其中两个:没有重新分配函数。当然,不可能完全做同样的事情realloc()
,因为简单地复制内存并不适合非聚合类型。但是这个函数会不会有问题:
bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
where
-
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
无法完全改变内存大小的分配器只能通过无条件实现这样的功能return false;
.
是否有很少的支持重新分配的分配器实现以至于不值得打扰?还是有一些我忽略的问题?
From:
http://www.sgi.com/tech/stl/alloc.html https://web.archive.org/web/20150307090036/http://www.sgi.com/tech/stl/alloc.html
这可能是最受质疑的
设计决策。它会有
可能更有用一点
提供重新分配的版本
要么改变了大小
现有对象,无需复制或
返回 NULL。这样就可以了
对于具有副本的对象直接有用
构造函数。它还会有
避免在情况下不必要的复制
其中原始对象没有
已被完全填满。
不幸的是,这将有
禁止使用 C 中的 realloc
图书馆。这反过来又会增加
许多分配器的复杂性
实施,并且会做出
与内存调试交互
工具比较难。于是我们决定
反对这种替代方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)