我是用C++编程员就考虑使用D为一个个人项目,我想要玩弄。我想知道是否有一种方法完全禁用的垃圾收集器,什么风险是,这样做。

我知道我可以管理自己的记忆通过重新删除使用malloc和免费的,但如果我做了,我宁愿垃圾收集器无法运行。

有帮助吗?

解决方案

关闭的GC在D2:

import core.memory;

void main(string[] args) {
    GC.disable;
    // Do stuff.
}

如果使用D1/火卫一:

import std.gc;

void main(char[][] args) {
    std.gc.disable;
    // Do stuff.
}

在D1/Tango:

import tango.core.Memory;

void main(char[][] args) {
    GC.disable;
    // Do stuff.
}

GC可以重新启用同样地通过调用GC。启用(D2或D1/Tango)或标准。gc。启用(D1/火卫一).这些可以在任何一点的程序。在内部,一个计数器被使用,并实际上重新启用的GC,你必须打电话给启用()一旦为每一次禁止()was called.

这里有一些事情不做GC障碍,因为它们将导致存储器泄漏:

  1. 不要使用的阵列的追加(~=)操作者或使用。长度的财产扩大到一系列已经分配。依靠这些GC到的免费老阵列,如果它已被重新分配,因为有可能混到这地方的其他程序。
  2. 不要使用内联阵列。唯一的方法,以免这些是通过GC。
  3. 大多数火卫一,我相信,探戈、设计的假设是,垃圾收集。功能在这些图书馆可能泄漏的记忆可怕,如果使用w/o GC。
  4. 不使用D2关闭与GC残疾人。(不,你会无论如何,一个游戏。)

这就是说,虽然D的设计是有用的GC无障碍在一些关键的代码(一种关键的作品真实的时间限制的存在和你也许不应该使用任何形式的malloc不明确设计用于真正的时间计算,无论如何),这主要是设计用的假设,即GC会。在你的情况下,仍然可以使用的GC的所有初始化的东西,等等。而仅禁止它当你击中的一部分的你的游戏,实际上需要真正的时间。

作为一个侧面说明,GC和手册,内存管理可以同时存在D,并在实践中,优化时代码、手动删除一些大型的对象微不足道的寿命可能会导致重大的加速.这可以类似于用C++,使用删除的声明,并且是安全的,即使GC启用。当你没有真正的时间限制,这给你大部分的好处的GC与大多数的业绩手册,内存管理。

其他提示

如果你想使用malloc和free使用 std.c.stdlib 。 GC永远不会碰这些。 std.gc 有你需要的内存管理,包括禁止所有的东西()。

GC是不是虽然是一件坏事。大多数,如果不是几乎所有d图书馆将在内存没有显式删除,所以它不会让你的英雄有它永诺关闭,但代码的地方确定的,如果你有一些关键的性能要求。

GC使得一切更大量生产像阵列切片和在创建新的参数对象,而无需呼叫者的任何地方存储他们的参考。好的码是它和少了很多GC代码变得小了很多。

GC能够被移除并用周围的malloc /免费一个简单的包装替代。

我在读关于D语言和我发现这个的前,似乎在新的D:

40.好C

-betterC是一个命令行标志dmd,这限制了编译器的支持的某些运行时的特点。值得注意的是,D节目的或图书馆编制betterC不是与Druntime.使用的汇编时的特征是不限制任何方式。 https://dlang.org/spec/betterc.html

一个后果使用这个命令-线标志是禁用的GC和语言特性中继。

40.1后果

因为没有Druntime是可用的,许多D功能不会的工作。例如:

  • 垃圾收集
  • 线本地的储存
  • 所属类别和ModuleInfo
  • 建立在线程(例如核心。线)
  • 动态阵列(但不是片)和联阵列
  • 例外情况
  • 开关有弦
  • 最后的开关
  • 同步和核心。同步
  • 静态模块的构造或deconstructors
  • 结构deconstructors
  • 单元测试(测试可以像往常一样-betterC标志)

也参看 https://dlang.org/blog/2017/08/23/d-as-a-better-c/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top