C++ 分配器无状态意味着什么?

C++ 分配器无状态意味着什么?,c++,stl,allocator,C++,Stl,Allocator,分配器无状态意味着什么?我意识到std::allocator是malloc的包装器,没有自己的状态。同时,malloc自己记账,因此可以说所有std::allocator实例都使用单个状态 我如何实现一个没有状态的池分配器?如果不是分配器,什么会保持内存的当前状态 有人能正式定义这个上下文中状态的含义吗?状态意味着类的实例中包含可变信息。无国籍意味着他们没有。无状态类没有非静态数据成员 您可以通过使用对该类型的所有池分配器相同的相互外部状态(池),使池分配器成为无状态的 不鼓励分配器对象本身是有

分配器无状态意味着什么?我意识到std::allocator是malloc的包装器,没有自己的状态。同时,malloc自己记账,因此可以说所有std::allocator实例都使用单个状态

我如何实现一个没有状态的池分配器?如果不是分配器,什么会保持内存的当前状态


有人能正式定义这个上下文中状态的含义吗?

状态意味着类的实例中包含可变信息。无国籍意味着他们没有。无状态类没有非静态数据成员


您可以通过使用对该类型的所有池分配器相同的相互外部状态(池),使池分配器成为无状态的

不鼓励分配器对象本身是有状态的。这意味着,如果您创建了
std::allocator
(或您自己的)的实例,则此实例不应包含有关已分配块等的任何信息-此信息必须是
静态的
,并在所有
std::allocator
实例之间共享。违反此规则可能会导致STL库中出现未定义的行为

例如,查看
std::list::splice
:它从一个
std::list
中删除元素并将其插入另一个
。实际上,对包含的元素不做任何处理(没有复制等)-此方法只是重新排列内部指针。所以,如果
std::allocator
instance#1(在列表#1中)知道一些东西,那么哪些东西不知道
std::allocator
instance#2(在列表#2中)?这些元素将丢失、泄露、自动删除或其他


在STL上阅读此类内容的好方法是“有效的STL”,Scott Meyers将其称为“内部无状态”会更清楚吗?C++03可能就是这种情况,但C++11明确支持有状态分配器。“违反此规则可能会导致STL库中未定义的行为。”你能链接一个说明以下内容的文档页面吗please@Felipe “所有自定义分配器也必须是无状态的(直到c++11)”,因为c++11需要使用特殊的机制在分配器之间传输指针所有权。谢谢,你是否碰巧知道gcc 5.1.0中是否实现了c++11状态机制?@Felipe我不确定这是否适用于默认值(std)分配器,因为我认为它们是无状态的。在这种情况下,如何才能确保只使用C++语言特征的线程安全性?如果每个分配或解除分配的调用都可以在互斥体上阻止,这不是问题吗?如何实现分配器的无锁线程安全性有几种可能性。例如,它可以从不同的PARTI分配。基于当前线程的std::thread::id的池的ons。当前编译器和c++03标准的一部分普遍支持此功能?否。c++03根本没有线程。线程和线程安全在c++03中完全是特定于实现和平台的。您必须直接使用POSIX或Windows线程,或者依赖第三方库l当使用C++03时,ike boost不是默认的。对于gcc,您必须使用选项-pthreads进行编译,以实现malloc是线程安全的。对于Visual C,您必须使用/MT、/MTd、MD或/MDd中的一种使malloc成为线程安全的。