Ответ 1
Чтобы отключить 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.enable(D2 или D1/Tango) или std.gc.enable(D1/Phobos). Это можно сделать в любой момент программы. Внутри используется счетчик, и для фактического повторного включения GC вы должны вызывать enable() один раз для каждого вызова disable().
Вот некоторые вещи, которые не связаны с отключением GC, потому что они вызовут утечки памяти:
- Не используйте оператор массива append (~ =) или используйте свойство .length для увеличения массива, который уже был выделен. Они полагаются на GC, чтобы освободить старый массив, если он должен быть перераспределен, поскольку в нем может быть сглаживание в другом месте программы.
- Не используйте встроенные ассоциативные массивы. Единственный способ освободить их - GC.
- Большинство Phobos и, я считаю, Tango, были спроектированы с предположением о том, что сбор мусора присутствует. Функции в этих библиотеках могут сильно испортить память при использовании без GC.
- Не используйте закрытие D2 с отключенным GC. (Не то, чтобы вы все равно играли.)
Тем не менее, в то время как D предназначен для использования с отключенным GC в нескольких критических фрагментах кода (типа критических элементов, где существуют ограничения в режиме реального времени, и вы, вероятно, не должны использовать какую-либо форму malloc, явно не разработанную для вычисления в реальном масштабе времени в любом случае), он был в значительной степени разработан с предположением о том, что GC будет присутствовать. В вашем случае вы все равно можете использовать GC для всех вещей инициализации и т.д. И только отключите его, когда попадете в ту часть своей игры, которая на самом деле должна быть в режиме реального времени.
В качестве побочного примечания, GC и ручное управление памятью могут сосуществовать в D, и на практике, при оптимизации кода, ручное удаление некоторых крупных объектов с тривиальным временем жизни может привести к значительным ускорениям. Это можно сделать аналогично С++, используя инструкцию delete и безопасно делать, даже если GC включен. Когда у вас нет ограничений в режиме реального времени, это дает вам большую часть преимуществ GC с большей эффективностью ручного управления памятью.