Чтобы отключить ГХ в 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 / Танго:
import tango.core.Memory;
void main(char[][] args) {
GC.disable;
// Do stuff.
}
GC можно включить аналогичным образом, вызвав GC.enable (D2 или D1 / Tango) или std.gc.enable (D1 / Phobos). Это может быть сделано в любой точке программы. Внутренне используется счетчик, и для фактического повторного включения GC вы должны вызывать enable () один раз при каждом вызове disable ().
Вот некоторые вещи, которые нельзя делать с отключенным GC, поскольку они могут вызвать утечку памяти:
- Не используйте оператор присоединения массива (~ =) и не используйте свойство .length для увеличения уже выделенного массива. Они полагаются на то, что GC освобождает старый массив, если он должен быть перераспределен, поскольку в нем может быть псевдоним где-то еще в программе.
- Не используйте встроенные ассоциативные массивы. Единственный способ освободить их - GC.
- Большая часть Фобоса и, как мне кажется, Танго, были спроектированы с предположением о наличии сбора мусора. Функции в этих библиотеках могут привести к ужасной утечке памяти при использовании без GC.
- Не используйте крышки D2 с отключенным GC. (В любом случае, не так, как для игры.)
Тем не менее, хотя D спроектирован так, чтобы его можно было использовать с отключенным GC в нескольких критических фрагментах кода (таких критических фрагментах, где существуют ограничения в реальном времени, и вам, вероятно, не следует использовать какую-либо форму malloc, явно не разработанную для вычислений в реальном времени, так или иначе), это было в значительной степени разработано с предположением, что GC будет присутствовать. В вашем случае вы все равно можете использовать GC для всех вещей инициализации и т. Д. И отключать его только тогда, когда вы попадаете в ту часть игры, которая действительно должна быть в реальном времени.
В качестве примечания, ГХ и ручное управление памятью могут сосуществовать в D, и на практике при оптимизации кода ручное удаление некоторых крупных объектов с тривиальными временами жизни может привести к значительному ускорению. Это можно сделать аналогично C ++, используя оператор delete, и это безопасно сделать, даже если включен GC. Если у вас нет ограничений в реальном времени, это дает вам большинство преимуществ GC и большую часть производительности ручного управления памятью.