我没有确切的答案,但我可以说:
1)最确定的来源是gc的源代码:
https ://github.com/D-Programming-Language/druntime/blob/master/src/gc/gc.d
(我很确定非常相似的gcx .d 文件
2)当您进行 gc 分配时,gc 可以预期运行(好吧,如果它认为需要分配一个新块,那么它会首先尝试收集现有的东西,但根据我的经验,在实践中,最好假设每一个 new 都可以是一个 gc 集合),在程序终止时,并且没有其他地方 - 如果你不分配 gc 内存,gc 实际上不会做任何事情。它不会阻止您的程序随机运行。
但是,如果您不知道在哪里看,它可能看起来很随机。检查此页面的底部:http:
//dlang.org/garbage.html
最常见的就是数组字面量:auto x = [1,2,3]; 是一个runtime gc分配!也有相当多的 phobos 函数可以进行 gc 分配,尽管不是全部。如果 phobos 函数曾经返回一个数组(包括一个字符串),那么它分配的几率很高 - 如果没有别的,返回值很可能是一个新块,除非你知道你传递了一个缓冲区来接收数据。
也就是说,许多 phobos 实际上是免费分配的,并且随着每个版本的发布而变得更好。我相信所有 std.algorithm 和 std.digest 包现在都是免费分配的,等等。所以你不必把它全部扔掉,只要知道要避免哪些功能。
如果您编写了一个程序并想找到隐藏的分配,我会使用调试器。在主循环之前设置断点。然后在 gc_malloc 和 gc_qalloc 处设置断点并继续。如果它坏了,获取堆栈跟踪,现在你知道以后要避免什么。
如果你的主循环是免费的 gc 分配,它也将是免费的 gc 收集。
3) gc 会扫描所有内存吗?不必要。有一个 noscan 标志表明 gc 实现(参见源代码中的标记函数)可以跳过块。在 druntime/src/rt/lifetime.d 中,你可以看到这个(这里称为 BlkAttr.NO_SCAN)是基于 TypeInfo 设置的。这不是很精确,但我很确定它在诸如大数组分配之类的东西上设置正确。不应扫描您游戏的批量数据资产。
因此,它所花费的时间将与它实际扫描的内存量成正比,这可能比您分配的内存量少很多。