分配器无状态意味着什么?我意识到 std::allocator 是 malloc 的包装器,并且没有自己的状态。同时,malloc 自己记账,所以可以说所有 std::allocator 实例都使用一个状态。
我将如何实现没有状态的池分配器?如果不是分配器,什么会保持当前的内存状态?
有人可以正式定义在这种情况下状态的含义吗?
状态意味着类的实例中包含可变信息。无状态意味着他们没有它。无状态类没有非静态数据成员。
您可以通过使用对于该类型的所有池分配器都相同的一些相互外部状态(池)来使池分配器成为无状态的。
不鼓励分配器对象本身是有状态的。这意味着如果您创建一个std::allocator
(或您自己的)实例,该实例不应包含有关已分配块等的任何信息 - 此信息必须static
在所有std::allocator
实例之间共享。违反此规则可能会导致 STL 库中出现未定义的行为。
例如,看std::list::splice
:它从一个中删除元素的间隔std::list
并插入到另一个中。对包含的元素真的没有做任何事情(没有复制等) - 这种方法只是重新排列内部指针。那么,如果std::allocator
实例#1(在列表#1 中)知道一些东西,那么什么不知道std::allocator
实例#2(在列表#2 中)?这些元素将丢失,memleaked,自发删除或其他......
关于 STL 这类事情的好读物是“Effective STL”,Scott Meyers