cha*_*adb 8 c++ architecture memory design-patterns memory-management
我一直在研究切换我的分配方法,从简化重载新到通过代码库使用多个分配器.但是,如何有效地使用多个分配器?我可以通过我的研究设计的唯一方法是让分配器成为全局变量.虽然,这似乎有问题,因为使用许多全局变量通常是一个"坏主意".
我想找到如何有效地使用多个分配器.例如,我可能只有一个分配器用于特定子系统,而另一个分配器用于不同的子系统.我不确定这样做的唯一方法是使用多个全局分配器,所以我希望有更好的洞察力和设计.
Die*_*ühl 11
在C++ 2003中,分配器模型被破坏,并没有真正适当的解决方案.对于C++ 2011,分配器模型是固定的,您可以将每个实例分配器传播到包含的对象(当然,除非您选择替换它们).通常,为了std::allocator<T>
使它有用,您可能希望使用动态多态分配器类型,默认情况下不需要(并且通常我希望它不是动态多态的,尽管这可能是更好的实现选择).但是,[几乎]标准C++库中进行内存分配的所有类都是将分配器类型作为模板参数的模板(例如,IOStream是一个例外,但通常它们不会分配任何有意义的内存量来保证添加分配器支持).
在您的一些评论中,您坚持认为分配器实际上需要是全局的:这绝对不正确.每个分配器识别类型存储给定的分配器的副本(至少,如果它具有任何实例级数据;如果它没有,则不存储任何东西,例如默认分配器使用operator new()
和的情况operator delete()
).这实际上意味着只要存在使用它的任何活动分配器,给予对象的分配机制就需要保持不变.这可以使用全局对象来完成,但也可以使用例如引用计数或将分配器与包含给定它的所有对象的对象相关联来完成.例如,如果每个"文档"(想想XML,Excel,Pages,无论结构文件)都将分配器传递给其成员,那么分配器可以作为文档的成员生存,并在文档被销毁后销毁所有内容后销毁. .分配器模型的这一部分应该与C++之前的2011类一起使用,只要它们采用分配器参数.但是,在C++ 2011之前的类中,分配器不会传递给包含的对象.例如,如果您将分配器赋予std::vector<std::string>
C++ 2011版本,则将std::string
使用分配器创建s,并将其分配给std::vector<std::string>
适当转换以处理std::string
s.使用pre-C++ 2011分配器不会发生这种情况.
要在子系统中实际使用分配器,您实际上需要传递它们,或者显式地作为函数和/或类的参数,或者通过作为上下文的分配器感知对象隐式地传递它们.例如,如果您使用任何标准容器作为传递的上下文的[部分],则可以使用其get_allocator()
方法获取已使用的分配器.