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