C++ STL 分配器与 new 运算符

2024-01-04

根据C++ Primer第4版,第755页,有一条注释说:

现代 C++ 程序通常应该使用分配器类 来分配内存。它更安全、更灵活。

我不太明白这个说法。 到目前为止,我读过的所有材料都教授使用new在C++中分配内存。 书中展示了向量类如何使用分配器的示例。 但是,我无法想到其他场景。

谁能帮忙澄清一下这个说法?并给我更多的例子? 我什么时候应该使用分配器以及什么时候使用new?谢谢!


对于一般编程,是的,你应该使用new and delete.

但是,如果您正在编写一个库,则不应该! 我没有你的教科书,但我想它是在编写库代码的背景下讨论分配器。

图书馆的用户可能希望准确控制从哪里分配什么。如果图书馆的所有分配都已完成new and delete,用户将无法进行细粒度的控制。

所有 STL 容器都采用可选的分配器模板参数。然后容器将使用该分配器来满足其内部内存需求。默认情况下,如果省略分配器,它将使用std::allocator http://en.cppreference.com/w/cpp/memory/allocator它使用new and delete(具体来说,::operator new(size_t) and ::operator delete(void*)).

这样,该容器的用户可以根据需要控制内存的分配位置。

实现与 STL 一起使用的自定义分配器的示例和说明:使用 STL 的自定义池分配器提高性能 http://drdobbs.com/cpp/184406243

边注:STL 分配器方法在很多方面都不是最佳的。我推荐阅读迈向更好的分配器模型 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1850.pdf对其中一些问题进行讨论。

2019年编辑:自从写完这个答案以来,C++ 中的情况已经有所改善。有状态分配器是支持的 https://www.boost.org/doc/libs/1_68_0/doc/html/container/cpp_conformance.html#container.cpp_conformance.alloc_traits_move_traits在 C++11 中,该支持在 C++17 中得到了改进。一些参与“迈向更好的分配器模型”的人也参与了这些变革(例如:N2387 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2387.pdf),这样很好(:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL 分配器与 new 运算符 的相关文章

随机推荐

  • 主成分分析降维

    我正在努力表演PCA http en wikipedia org wiki Principal component analysis将 900 个维度减少到 10 个 到目前为止 我有 covariancex cov labels V d
  • 如何将焦点设置在 ace 编辑器上?

    我在 jquery 选项卡界面中使用来自 ajax org 的 ace 编辑器组件 每个选项卡将包含一个单独的 ace 编辑器 每当我切换到新选项卡时 其中的编辑器都不会获得焦点 我可以通过绑定到 jquery UI 的 tabsshow
  • 如何将 NSUUID 表示为字符串?

    我怎样才能转换NSUUID to NSString NSString url self mysql process ESTIMOTE PROXIMITY UUID NSString mysql process NSUUID beacon i
  • 矩阵乘法的分而治之

    我无法让分而治之的矩阵乘法发挥作用 据我了解 您将大小为 nxn 的矩阵分成象限 每个象限为 n 2 然后执行以下操作 C11 A11 B11 A12 B21 C12 A11 B12 A12 B22 C21 A21 B11 A22 B21
  • 使用 C 语言堆栈的计算器

    我正在尝试用 c 创建一个计算器 它可以优先计算并获得正确的结果 例如 5 5 3 3 gt 9 1 2 3 gt 9 我下面的代码可以计算这些示例 但对于这样的事情 2 5 2 5 我的程序给出了错误的答案 我用的是2个堆栈 一种用于操作
  • Laravel API 注册用户 - 检查重复电子邮件

    我正在使用 Laravel 5 5 API 路线routes api php像这样注册新用户 Route post users function Request request user new User if Input get name
  • 未设置对象变量或 With 块变量(错误 91)

    我有以下代码 Sub AddSources Dim pubPage As Page Dim pubShape As Shape Dim hprlink As Hyperlink Dim origAddress As String Dim e
  • mac osx:无法使用 virtualenv

    我正在尝试使用 virtualenv 创建一个环境 virtualenv test New python executable in test bin python Error Errno 2 No such file or directo
  • jquery从外部页面循环链接到特定幻灯片?

    仔细研究了所有其他问题 但我无法弄清楚这一点 我有一个主页 其中包含我使用 jquery 循环插件的另一个页面的某些幻灯片 我需要做的是将主页上的链接直接链接到不是组中第一张幻灯片的幻灯片 没什么那么复杂 我的主页上有一个这样的链接 a h
  • PHP preg_replace 的 JavaScript 等效项

    我一直在寻找 PHP 的 js 等效项preg replace功能和我到目前为止发现的只是string replace 但是我不知道如何将我的正则表达式转换为 JavaScript 这是我的 PHP 代码 preg replace str
  • ios 7 模拟器不会为针对 ios 6.1 sdk 编译的应用程序提供回退用户界面

    我们的 ios6 1 sdk 编译的应用程序在 ios 6 1 iPhone 4 4s 和 5 设备上运行良好 当在 ios7 iphone 5s 上运行该应用程序时 用户界面仍然看起来像 ios 6 黑色按钮等 但我们对大部分内容都很好
  • 找不到协议socket.getprotobyname

    我正在尝试连接到rabbitMQ服务器 但它在与a的连接时始终失败socket error protocol not found错误 In 1 import pika In 2 pika BlockingConnection pika Co
  • Python PIL 错误地解码 TIFF 颜色(使用不正确的色彩空间)?

    当我使用PIL 1 1 7加载 TIFF 图像时 颜色空间似乎错误 这是怎么回事 The tiff是使用创建的convert test jpg test tiff 但其他 tiff 文件似乎也会发生 可以在以下位置找到 http hul w
  • 以编程方式对 JTable 进行排序

    有没有办法以编程方式对 JTable 进行排序 我让 JTable 的排序工作 使用 setRowSorter 这样当用户按下任何列时 表就会被排序 我知道 SWingX JXTable 可能会工作 但我不想经历这个麻烦 因为其他一切现在都
  • Android 通知有一个彩色图标,而不是变成白色

    我的 Android 应用使用 Firebase Cloud Messaging 进行通知 当收到通知时 该图标不会像其他图标一样变成白色 我在用着targetSdkVersion 23 我的清单中有这个
  • 正则表达式: ?: 符号(问号和冒号符号)[重复]

    这个问题在这里已经有答案了 我有以下 Java 正则表达式 它不是我编写的 我正在尝试修改 class map s match all s match any s x21 x7e 1 40 它类似于this one https stacko
  • 如何配置 php.ini 以使用 gmail 作为邮件服务器

    I want to learn yii as my first framework And I m trying to make the contact form work But I got this error 我已经配置了 php i
  • 通知通过旧意图附加

    我正在通过以下代码在 BroadcastReceiver 内创建通知 String ns Context NOTIFICATION SERVICE NotificationManager mNotificationManager Notif
  • 像导航抽屉一样实现 Gmail 平板电脑

    我正在研究 Gmail 应用程序的平板电脑设计 在那里面Navigation Drawer实施与其他不同 我已附上图片供您参考 而且当我展开抽屉时 它应该像正常的导航抽屉行为一样发生 我想以同样的方式实施 我正在寻找 但我只找到了这个lin
  • C++ STL 分配器与 new 运算符

    根据C Primer第4版 第755页 有一条注释说 现代 C 程序通常应该使用分配器类 来分配内存 它更安全 更灵活 我不太明白这个说法 到目前为止 我读过的所有材料都教授使用new在C 中分配内存 书中展示了向量类如何使用分配器的示例