禁用D的GC是否"没问题"?

Naf*_*ees 3 garbage-collection memory-leaks d

我正在为我创建的字节代码做一个解释器,它需要非常快,为此,我不希望GC成为瓶颈,所以我禁用它,使用 GC.disable();

但是我经常在互联网上读到D的库要求GC在那里,但是我没有使用很多库,我的问题是,如果我使用以下模块中的以下内容,它是否需要GC?:

  1. to 来自std.conv
  2. canFind 来自std.algorithm
  3. file.read 来自std.file
  4. File 来自std.stdio

我正在使用我程序中提到的模块的上述功能,前提是禁用GC是否安全?

小智 7

你误解了GC的禁用功能.除非你真的把它编译出来,否则GC总是可以通过例如new来使用.

现在有一些关于GC如何工作的基础知识,当你分配新内存时,它必须确定它是否可以分配,如果它不能,它必须尝试清理现有内存才能分配.所以对于D的GC,只要有分配就可以继续收集.现在禁用GC只会阻止它继续进行并在分配时进行收集.你总是可以手动鼓动它这样做.

对于解释器,只要您阻止分配(重用内存),您甚至不需要禁用GC以防止它减慢速度.所以记住规则,"大"分配并重用那个内存!


Cod*_*ine 5

如果您只是想避免调用垃圾收集,那么诀窍就是不要为GC创建任何对象来清理.值得庆幸的是,D有一个属性,将在编译时检查以确保您不会意外地创建任何垃圾:@nogc

有一个很好的描述:http://ddili.org/ders/d.en/functions_more.html