Tre*_*key 17 c++ memory-management stl allocator delete-operator
std::allocator
是对底层内存模型的抽象,它包含了调用new
和的功能delete
. delete
虽然不需要大小,但是deallocate() 需要它.
void deallocate(T*p,std :: size_t n);
"参数n必须等于最初生成p的allocate()调用的第一个参数;否则,行为是未定义的."
为什么?
现在我要么在解除分配之前进行额外的计算,要么开始存储我传递给分配的大小.如果我没有使用分配器,我就不必这样做了.
Rei*_*ica 23
std::allocator
API 的设计- Allocator
概念 - 是为了促进潜在替代品的工作.
std::allocator
是对底层内存模型的抽象
它不一定是!一般情况下,分配器不需要用C malloc
和free
,也没有delete
或不到位的new
.是的,默认的通常是这样,但分配器机制不仅仅是对C的内存模型的抽象.不同之处通常是自定义分配器的全部目的.请记住,分配器是可替换的:特定的std::allocator
可能不需要释放的大小,但任何替换都可能.
一个兼容的实现std::allocator
可以自由断言你确实传递了正确n
的deallocate
,并且取决于正确的大小.
它发生malloc
,并free
存储在其数据结构的块大小.但一般来说,分配器可能不会这样做,并且要求它这样做是过早的悲观化.假设您有一个自定义池分配器并且正在分配int
s 块.在典型的64位系统上,存储64位size_t
和32位的开销是200%int
.分配器的用户更好地定位在分配中存储大小,或者以更便宜的方式确定大小.
好的malloc实现不会为每个小分配存储分配大小; 它们并且能够从指针本身导出块大小,例如通过从块指针导出块指针,然后检查块头的块大小.这当然是一个细节.您可以使用特定于平台的API获取大小的下限,例如malloc_size
在OS X上,_msize
在Windows上,malloc_usable_size
在Linux上.
归档时间: |
|
查看次数: |
1307 次 |
最近记录: |