为什么std :: allocator :: deallocate需要大小?

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::allocatorAPI 的设计- Allocator概念 - 是为了促进潜在替代品的工作.

std::allocator 是对底层内存模型的抽象

它不一定是!一般情况下,分配器不需要用C mallocfree,也没有delete或不到位的new.是的,默认的通常是这样,但分配器机制不仅仅是对C的内存模型的抽象.不同之处通常是自定义分配器的全部目的.请记住,分配器是可替换的:特定的std::allocator可能不需要释放的大小,但任何替换都可能.

一个兼容的实现std::allocator可以自由断言你确实传递了正确ndeallocate,并且取决于正确的大小.

它发生malloc,并free存储在其数据结构的块大小.但一般来说,分配器可能不会这样做,并且要求它这样做是过早的悲观化.假设您有一个自定义池分配器并且正在分配ints 块.在典型的64位系统上,存储64位size_t和32位的开销是200%int.分配器的用户更好地定位在分配中存储大小,或者以更便宜的方式确定大小.

好的malloc实现不会为每个小分配存储分配大小; 它们并且能够从指针本身导出块大小,例如通过从块指针导出块指针,然后检查块头的块大小.这当然是一个细节.您可以使用特定于平台的API获取大小的下限,例如malloc_size在OS X上,_msize在Windows上,malloc_usable_size在Linux上.