C++ 中的多态分配器2025 年 5 月 13 日 | 阅读 10 分钟 引言在内存分配方面,C++ 语言一直允许用户定义自己的分配器,这些分配器负责内存的分配、释放和重用。这些分配器与类型绑定;使用分配器的每个容器或类都必须包含它。从设计角度来看,在某些内存管理策略可以互换或与容器实现完全分离的情况下,这种情况不太好。 为了解决其中一些问题,C++17 将多态资源和各种多态分配器的概念引入了语言,从而实现了一种高效、灵活的运行时内存分配管理机制。因为多态分配器将内存资源与分配器分离开来,所以它们是上下文敏感的,并且可以动态分配,这使得它们适用于当今的软件工程。 问题陈述让我们设想一个应用程序可能提供许多不同的内存分配场景的情况。例如,在
在这些情况下应用传统分配器可能导致
在这些情况下,需要多态分配器来更复杂地解决问题。 什么是多态分配器?在 C++ 中,多态分配器是 `<memory_resource>` 库的组件,与内存资源 (`std::pmr::memory_resource`) 配合使用。主要概念是消除分配器与内存资源之间的连接:应该在执行时完成在编译时执行的操作。 关键组件1. 内存资源 (`std::pmr::memory_resource`)抽象类代表灵活的内存分配策略。其中一些是
2. 多态分配器 (`std::pmr::polymorphic_allocator`)
3. 支持 PMR 的标准容器
它是如何工作的?1. 基本设置
2. 切换内存资源主要好处之一是能够动态切换内存资源 程序 1:带有多态分配器的任务队列输出 Executing task: Task A High-priority Task A 说明
程序 2:带有多态分配器的场景图示例输出 - Root - Camera - Camera Settings - Light - Intensity - Color - Mesh - Material - Vertices - Normals 说明1. SceneNode 类
2. Main 函数
程序 3输出 Simulation step 1: Intersection Downtown Intersection has 2 connected roads. Intersection Uptown Intersection has 2 connected roads. Road Main St has 1 vehicles. Vehicle Car 1 is moving to Downtown Intersection at speed 60 km/h. Road 2nd Ave has 1 vehicles. Vehicle Car 2 is moving to Uptown Intersection at speed 45 km/h. Vehicle Car 1 is moving to Uptown Intersection at speed 60 km/h. Vehicle Car 2 is moving to Downtown Intersection at speed 45 km/h. ======================= Simulation step 2: Intersection Downtown Intersection has 2 connected roads. Intersection Uptown Intersection has 2 connected roads. Road Main St has 1 vehicles. Vehicle Car 1 has no more routes. Road 2nd Ave has 1 vehicles. Vehicle Car 2 has no more routes. Vehicle Car 1 has no more routes. Vehicle Car 2 has no more routes. ======================= Simulation step 3: Intersection Downtown Intersection has 2 connected roads. Intersection Uptown Intersection has 2 connected roads. Road Main St has 1 vehicles. Vehicle Car 1 has no more routes. Road 2nd Ave has 1 vehicles. Vehicle Car 2 has no more routes. Vehicle Car 1 has no more routes. Vehicle Car 2 has no more routes. ======================= Simulation step 4: Intersection Downtown Intersection has 2 connected roads. Intersection Uptown Intersection has 2 connected roads. Road Main St has 1 vehicles. Vehicle Car 1 has no more routes. Road 2nd Ave has 1 vehicles. Vehicle Car 2 has no more routes. Vehicle Car 1 has no more routes. Vehicle Car 2 has no more routes. ======================= Simulation step 5: Intersection Downtown Intersection has 2 connected roads. Intersection Uptown Intersection has 2 connected roads. Road Main St has 1 vehicles. Vehicle Car 1 has no more routes. Road 2nd Ave has 1 vehicles. Vehicle Car 2 has no more routes. Vehicle Car 1 has no more routes. Vehicle Car 2 has no more routes. ======================= 说明
使用多态分配器的好处
用途
结论总之,C++ 多态分配器开启了现代内存分配模式的新趋势——可能是允许程序员更高效、更易于管理地构建基于应用程序的系统的最关键属性。多态分配器将能够创建使用多样化、变化和异构内存管理策略的应用程序,并推动应用程序的开发。 碎片化的对立面是一致性,它允许提高性能、减少碎片和内存资源的重用;多态分配器为实现这些目标提供了最简单、最优雅的解决方案。 |
在本文中,我们将讨论 C++ 中内存池与动态分配之间的区别。在讨论它们的区别之前,我们必须了解内存池和动态分配及其特性和用例。什么是内存池?内存池是一种优化机制,旨在...
阅读 4 分钟
在本文中,我们将探讨一些孪生素数对,并构建一个可以生成这种独特对的算法。将提供 C++ 示例来演示查找和打印孪生素数对的有效方法。孪生素数和素数概念素数...
阅读 4 分钟
亏数是正整数,其真约数(不包括数字本身)之和小于该数字。例如,8 是亏数,因为它的约数(1、2、4)之和为 7,小于 8。输入:10 输出:亏数 输入:12 输出:...
阅读 4 分钟
获取对象地址的一种安全方法是使用 std::to_address 实用函数,该函数已添加到 C++17 的 C++ 标准库中,无论它是智能指针的实例还是容器的元素。在 C++ 中,获取地址……
阅读 4 分钟
一个 21 边形数称为二十一边形数。根据公式 P21 (k) = k.(19k−17)/2,其中 k 是序列的位置。1、21、62、124 等数字依次排列。该概念的 C++ 实现将是...
阅读 4 分钟
下面的 C++ 程序通过 SSS 方法检查两个三角形的全等性。如果三个对应边完全相等,则两个三角形被认为全等。接受两个三角形的输入后,它会比较它们的边长。如果所有三个...
阅读 4 分钟
在许多情况下,编程和数学都很好地关联,它使开发人员能够尝试有趣且有趣的问题。一个有趣的此类概念是克里希那穆提数或强数。在本文中,我们将探讨克里希那穆提数的定义...
5 分钟阅读
在本文中,我们将讨论带有语法、返回值和示例。dlsym() 函数是什么?dlsym() 函数通过 dlopen() 调用获取由对象提供的符号地址。name 参数代表字符......
阅读 3 分钟
在理解 C++ 中虚函数和纯虚函数之间的区别之前,我们应该了解 C++ 中的虚函数和纯虚函数。什么是虚函数?虚函数是在基类中声明的成员函数,可以在派生类中重新定义...
5 分钟阅读
在本文中,我们将讨论 C++ 中 rewinddir() 函数的语法、一些信息和示例。什么是 rewinddir() 函数?rewindir() 函数用于将目录流的位置恢复到目录的开头,dirp 必须调用 rewinddir() 函数。与 opendir() 函数类似,rewindir()...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India