C++ 中的垃圾收集——为什么?

2024-05-26

我不断听到人们抱怨 C++ 没有垃圾回收功能。我还听说 C++ 标准委员会正在考虑将其添加到该语言中。恐怕我只是不明白它的意义...使用 RAII 和智能指针消除了它的需要,对吗?

我唯一的垃圾收集经验是在几台廉价的八十年代家用计算机上,这意味着系统会时不时地冻结几秒钟。我确信从那时起它已经有所改善,但正如你可以猜到的那样,这并没有让我对它有很高的评价。

垃圾收集可以为经验丰富的 C++ 开发人员提供哪些优势?


我不断听到人们抱怨 C++ 没有垃圾回收功能。

我很为他们感到难过。严重地。

C++ 有 RAII,但我总是抱怨在垃圾收集语言中找不到 RAII(或阉割过的 RAII)。

垃圾收集可以为经验丰富的 C++ 开发人员提供哪些优势?

另一个工具。

Matt J 在他的帖子中写得非常正确(C++ 中的垃圾收集——为什么? https://stackoverflow.com/questions/228620/garbage-collection-in-c-why#228640):我们不需要 C++ 功能,因为它们中的大多数都可以用 C 进行编码,并且我们不需要 C 功能,因为它们中的大多数可以用汇编进行编码,等等。C++ 必须不断发展。

作为开发人员:我不关心 GC。我尝试了 RAII 和 GC,我发现 RAII 优越得多。正如格雷格·罗杰斯在他的帖子中所说(C++ 中的垃圾收集——为什么? https://stackoverflow.com/questions/228620/garbage-collection-in-c-why#228670),内存泄漏并没有那么可怕(至少在 C++ 中,如果真正使用 C++,内存泄漏很少见),以至于证明 GC 而不是 RAII 是合理的。 GC 具有不确定性的释放/终结,只是一种方法编写不关心特定内存选择的代码.

最后一句话很重要:编写“只是不关心”的代码很重要。同样,在 C++ RAII 中,我们不关心资源释放,因为 RAII 为我们做这件事,也不关心对象初始化,因为构造函数为我们做这件事,有时只编码而不关心谁是内存的所有者是很重要的,以及这段或这段代码需要什么样的指针(共享、弱等)。C++中似乎需要GC。(即使我个人看不到)

在 C++ 中良好使用 GC 的示例

有时,在应用程序中,您有“浮动数据”。想象一下数据的树状结构,但没有人真正是数据的“所有者”(并且没有人真正关心数据何时会被销毁)。多个对象可以使用它,然后丢弃它。您希望当没有人再使用它时将其释放。

C++ 方法使用智能指针。我想到了 boost::shared_ptr 。所以每条数据都由它自己的共享指针拥有。凉爽的。问题在于,当每一条数据都可以引用另一条数据时。您不能使用共享指针,因为它们使用引用计数器,而引用计数器不支持循环引用(A 指向 B,B 指向 A)。所以你必须知道思考很多关于在哪里使用弱指针(boost::weak_ptr),以及何时使用共享指针。

使用 GC,您只需使用树形结构数据。

缺点是你不能在意when“浮动数据”真的会被破坏。仅此而已will be被毁了。

结论

所以最后,如果做得正确,并且与 C++ 的当前习惯用法兼容,GC 将是一个C++ 的另一个好工具.

C++ 是一种多范式语言:添加 GC 或许会让一些 C++ 粉丝因叛国而哭泣,但最终,这可能是一个好主意,我想 C++ 标准委员会不会让这种重大功能破坏语言,因此我们可以相信他们会做出必要的工作来启用正确的 C++ GC,而不会干扰 C++:与 C++ 中的一贯做法一样,如果您不需要某个功能,就不要使用它,它不会花费您任何费用。

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

C++ 中的垃圾收集——为什么? 的相关文章

随机推荐

  • PHP/PDO 和 SQL Server 连接以及 i18n 问题

    在我们的网络应用程序中 我们使用 PHP5 2 6 PDO 连接到 SQL Server 2005 数据库并存储俄语文本 数据库排序规则是Cyrillic General CI AS 表排序规则是Cyrillic General CI AS
  • VB6 ActiveX exe - 正确的注册顺序是什么?

    我最近更新了一个 Visual Basic 6 应用程序 它是一个 ActiveX exe 在 Windows XP 上运行 我有几个此应用程序的测试人员 他们已收到 exe 的副本并正在尝试运行它 但是 他们收到一条错误消息 Unexpe
  • 从 Redux 状态删除一个项目

    我想知道如果可能的话你是否能帮我解决这个问题 我正在尝试从 Redux 状态中删除一个项目 我已经传入了用户点击的项目的IDaction data进入减速机 我想知道如何匹配action data使用 Redux 状态中的 ID 之一 然后
  • 从 UIScrollView 中删除所有子视图?

    如何从 UIScrollview 中删除所有子视图 Let scrollView是一个实例UIScrollView 在 Objective C 中 这非常简单 只需致电makeObjectsPerformSelector 像这样 Objec
  • SQL Server 2005 中的计数(*) 与计数(Id)

    我使用 SQLCOUNT函数获取表中的总数或行数 以下两种说法有什么区别吗 SELECT COUNT FROM Table and SELECT COUNT TableId FROM Table 另外 在性能和执行时间方面有什么区别吗 Th
  • 设置 MySQL 触发器

    我听说过有关触发器的事情 我有几个问题 什么是触发器 我该如何设置它们 除了典型的 SQL 内容之外 是否还应该采取任何预防措施 触发器允许您在发生某些事件 例如 插入表 时在数据库中执行某个功能 我无法具体评论mysql 注意事项 触发器
  • 在字符串数组中查找下一个可用日期

    我一直在尝试找出如何根据当前日期获取下一个可用日期 即 如果今天是星期五 则在数组中搜索下一个最近的日期 例如数组值为 1 星期一 2 星期二 4 星期四 6 星期六 那么我的第二天应该是星期六 这是我尝试过的 Here i ll get
  • RecyclerView 上的删除按钮删除了错误的项目

    我正在使用 Firestore 适配器RecyclerView我在使用 删除 按钮时遇到问题 当我按下它时 它会删除错误的项目 而不是我想要的项目 这是我的按钮内部的代码onBindViewHolder protected void onB
  • 了解单目标迷宫的 A* 启发式

    我有一个像下面这样的迷宫 P
  • 传说在北卡罗来纳州地理地图上消失?

    我正在使用 R 编程语言 使用北卡罗来纳州的内置地图 我生成了 3 个随机变量 收入 孩子数量 体重 然后为此数据创建了地图 使用 传单 库 通过循环 library sf library mapview library leaflet l
  • jQuery Mobile 1.4.0:动态更改页面的标题和标题

    动态更改 jQuery Mobile 1 4 0 页面的标题 data role header 和 title 的正确方法是什么 添加方法有很多种toolbars 页眉 页脚 动态 此外 jQuery Mobile 1 4 提供intern
  • 检测堆栈已满

    在编写 C 代码时 我了解到使用堆栈来存储内存是一个好主意 但最近我遇到了一个问题 我有一个实验 其代码如下所示 void fun const unsigned int N float data 1 N N float data 2 N N
  • python:将base64编码的png图像转换为jpg

    我想使用 python 将一些 base64 编码的 png 图像转换为 jpg 我知道如何从 Base64 解码回原始 import base64 pngraw base64 decodestring png b64text 但现在我怎样
  • 土耳其语字符显示不正确[重复]

    这个问题在这里已经有答案了 MySql 数据库使用 utf 8 编码 数据存储正确 我使用 set name utf8 查询来确保调用的数据是 utf 8 编码 只要标头字符集是 utf 8 数据库中的所有变量都可以正常工作 但静态html
  • 无需发送消息即可获取 GCM 规范注册 ID

    我在使用 GCM 的应用程序时遇到问题 情况如下 该应用程序已安装 应用程序调用 GCM 注册方法获取注册 ID RID 1 该应用程序已卸载 再次安装该应用程序 应用程序再次调用 GCM 注册方法 获取注册 ID RID 2 在第 5 步
  • 如何在张量流中使用带有估计器的衰减学习率?

    我正在尝试将 LinearClassifier 与具有衰减学习率的 GradientDescentOptimizer 一起使用 My code def main load data features np load data feature
  • Wordpress/Woocommerce:以编程方式创建订单后,我还想以编程方式发送发票...如何?

    所以 我的网站涉及一个预订系统 流程如下 客人选择预订产品的日期 地点 提交请求后 系统会向主机发送一条消息以供审核 如果接受 我希望订单由客人支付 我的问题在这里 我已成功创建订单 理想情况下 我希望能够将客人发送到他们的 购物车 页面
  • 没有窗口的 GetFontUnicodeRanges

    有机会打电话吗GetFontUnicodeRanges没有窗户 例如 它可能是不允许与桌面交互的 Windows 服务 目前我正在使用控制台应用程序对此进行测试 program UnicodeConsoleOutput APPTYPE CO
  • 对 HashSet 进行子类化,以便在另一个集合中使用时始终使用某个 IEqualityComparer

    我想子类化HashSet
  • C++ 中的垃圾收集——为什么?

    我不断听到人们抱怨 C 没有垃圾回收功能 我还听说 C 标准委员会正在考虑将其添加到该语言中 恐怕我只是不明白它的意义 使用 RAII 和智能指针消除了它的需要 对吗 我唯一的垃圾收集经验是在几台廉价的八十年代家用计算机上 这意味着系统会时