分配器无国籍意味着什么?

时间:2012-09-22 15:24:47

标签: c++ stl allocator

分配器无国籍是什么意思?我意识到std :: allocator是malloc的包装器,并且没有自己的状态。同时,malloc也有自己的簿记,所以可以说所有std :: allocator实例都使用单个状态。

如何在没有状态的情况下实现池分配器?如果不是分配器,什么会保持当前的内存状态?

有人可以正式定义在这种情况下国家的含义吗?

2 个答案:

答案 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