c++ - 有效地使用多个分配器

标签 c++ design-patterns memory memory-management architecture

我一直在研究将我的分配方法从简单的重载新转换为通过代码库使用多个分配器。但是,如何有效地使用多个分配器?我可以通过我的研究设计的唯一方法是让分配器是全局的。虽然,这似乎有问题,因为使用许多全局变量通常是一个“坏主意”。

我正在寻找如何有效地使用多个分配器。例如,我可能有一个分配器仅用于特定子系统,而不同的分配器用于不同的子系统。我不确定这样做的唯一方法是否是通过使用多个全局分配器,所以我希望有更好的洞察力和设计。

最佳答案

在 C++2003 中,分配器模型被破坏,并没有真正合适的解决方案。对于 C++2011,分配器模型是固定的,您可以拥有每个实例的分配器,这些分配器会向下传播到包含的对象(当然,除非您选择替换它们)。通常,为了使这个有用,您可能需要使用默认的动态多态分配器类型std::allocator<T>。不需要(通常我希望它不是动态多态的,尽管这可能是更好的实现选择)。然而,[几乎]标准 C++ 库中所有进行内存分配的类都是模板,它们将分配器类型作为模板参数(例如,IOStreams 是一个异常(exception),但通常它们不会分配任何有趣的内存量来保证添加分配器支持)。

在您的一些评论中,您坚持认为分配器实际上需要是全局的:这绝对是不正确的。每个分配器感知类型都存储给定分配器的拷贝(至少,如果它有任何实例级数据;如果没有,则没有任何东西可以存储,例如默认分配器使用 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。这不会发生在 C++2011 之前的分配器中。

要在子系统中实际使用分配器,您将需要有效地传递它们,或者显式地作为函数和/或类的参数,或者通过充当上下文的分配器感知对象隐式传递。例如,如果您使用任何标准容器作为传递的上下文的 [部分],您可以使用它的 get_allocator() 获取使用的分配器。方法。

关于c++ - 有效地使用多个分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650490/

相关文章:

c++ - 对 CUDA 代码使用 C++ header 结构

c++ - float 倍数和除法精度问题

c++ - 在 OpenCV 2.3.1 中使用特征库

JAVA扩展类的内存使用

c++ - 接收所有使用 C 套接字发送的数据

c# - 这是正确的 OOP 设计吗?静态函数返回对象实例

java - 多模式使用的副作用

php - 在 laravel Controller 构造函数中注入(inject)模型

java - Android Bitmap OutOfMemoryError + 游戏如何处理大量图像?

c - 内存分配问题c