gpt4 book ai didi

c++ - 到 GC 或不到 GC

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

我最近看到了两个非常好的和有教育意义的语言讲座:

This first one由 Herb Sutter 撰写,介绍了 C++0x 的所有漂亮和酷炫的特性,为什么 C++ 的 future 似乎比以往任何时候都更加光明,以及 M$ 如何被认为是这个游戏中的好人。演讲围绕着效率以及最小化堆事件如何经常提高性能。

This other one ,作者 Andrei Alexandrescu,插入了从 C/C++ 到他的新游戏规则改变者 D过渡。 D 的大部分东西似乎都非常有动力和设计。然而,让我感到惊讶的是,D 插入了垃圾收集,并且所有类都是通过引用单独创建的。更令人困惑的是,The D Programming Language Ref Manual 一书特别在关于资源管理的部分中陈述了以下内容,引用:

垃圾收集消除了繁琐、容易出错的内存分配跟踪代码在 C 和 C++ 中是必需的。这不仅意味着更快的开发时间和更低的维护成本,但生成的程序经常运行更快!

这与 Sutter 一直在谈论最小化堆事件相冲突。我非常尊重 Sutter 和 Alexandrescou 的见解,所以我对这两个关键问题感到有些困惑

  1. 仅通过引用创建类实例不会导致大量不必要的堆事件吗?

  2. 在哪些情况下我们可以在不牺牲运行时性能的情况下使用垃圾回收?

最佳答案

直接回答你的两个问题:

  1. 是的,通过引用创建类实例确实会导致大量堆事件,但是:

    一个。在 D 中,您有 struct 以及 classstruct 具有值语义,并且可以做类可以做的所有事情,除了多态性。

    b.由于 slicing problem,多态性和值语义从来没有很好地协同工作。 .

    c。在 D 中,如果您确实需要在某些性能关键代码中在堆栈上分配一个类实例并且不关心安全性的损失,您可以通过 scoped 执行此操作而不会造成不合理的麻烦。功能。

  2. 如果满足以下条件,GC 可以与手动内存管理相当或更快:

    一个。您仍然尽可能在堆栈上进行分配(就像您通常在 D 中所做的那样),而不是依赖堆来处理所有事情(就像您在其他 GC 语言中经常做的那样)。

    b.你有一个顶级的垃圾收集器(D 当前的 GC 实现确实有点幼稚,尽管它在过去的几个版本中看到了一些主要的优化,所以它没有以前那么糟糕)。

    c。您分配的主要是小对象。如果您分配大部分大型数组并且性能最终成为问题,您可能希望将其中一些切换到 C 堆(您可以访问 C 的 malloc 并在 D 中释放),或者,如果它具有作用域生命周期,则其他一些分配器如 RegionAllocator . (RegionAllocator 目前正在讨论和完善,以便最终包含在 D 的标准库中)。

    d。你不太关心空间效率。如果您让 GC 运行过于频繁而无法将内存占用保持在超低水平,那么性能将会受到影响。

关于c++ - 到 GC 或不到 GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7575055/

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