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