gpt4 book ai didi

c++ - RAII 与垃圾收集器

转载 作者:IT老高 更新时间:2023-10-28 12:06:31 26 4
gpt4 key购买 nike

我最近在 CppCon 2016 上观看了 Herb Sutter 关于“Leak Free C++...”的精彩演讲,他谈到了使用智能指针来实现 RAII(资源获取即初始化)- 概念以及它们如何解决大部分内存问题泄漏问题。

现在我想知道。如果我严格遵守 RAII 规则,这似乎是一件好事,那为什么与在 C++ 中使用垃圾收集器有什么不同呢?我知道使用 RAII,程序员可以完全控制何时再次释放资源,但是在任何情况下,这对仅仅拥有一个垃圾收集器有好处吗?效率真的会低吗?我什至听说有一个垃圾收集器可以更有效,因为它可以一次释放更大的内存块,而不是在整个代码中释放小块内存。

最佳答案

If I strictly follow RAII rules, which seems to be a good thing, why would that be any different from having a garbage collector in C++?

虽然两者都处理分配,但它们以完全不同的方式处理。如果您要引用 Java 中的 GC,则会增加其自身的开销,从资源释放过程中移除一些确定性并处理循环引用。

您可以在特定情况下实现 GC,但性能特征会有很大不同。我在高性能/高吞吐量服务器中实现了一次用于关闭套接字连接(仅调用套接字关闭 API 花费了太长时间并且降低了吞吐量性能)。这不涉及内存,只涉及网络连接,并且不涉及循环依赖处理。

I know that with RAII the programmer is in full control of when the resources are freed again, but is that in any case beneficial to just having a garbage collector?

这种确定性是 GC 根本不允许的特性。有时您希望能够知道在某个时间点之后,已经执行了清理操作(删除临时文件、关闭网络连接等)。

在这种情况下,GC 不会削减它,这就是在 C# 中(例如)你有 IDisposable 接口(interface)的原因。

I even heard that having a garbage collector can be more efficient, as it can free larger chunks of memory at a time instead of freeing small memory pieces all over the code.

可以...取决于实现。

关于c++ - RAII 与垃圾收集器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44325085/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com