Неуправляемое управление памятью в D - PullRequest
1 голос
/ 26 августа 2010

Какой лучший способ избежать использования GC в D? Есть ли способ использовать классы, которые не связаны с управлением их памятью, или вам нужно использовать указатели на структуры malloc'd, как в C и C ++?

Ответы [ 4 ]

3 голосов
/ 26 августа 2010

Давным-давно было решено, что классы должны быть ссылочными типами из-за проблемы нарезки .С другой стороны, D - системный язык.Поэтому использование классов с ручным управлением памятью уродливо, но выполнимо.

В D2 + Phobos вы можете (небезопасно) размещать экземпляр класса в стеке, используя std.typecons.scoped().Вы можете (опять же, небезопасно) выделить класс в любом произвольном блоке памяти, используя std.conv.emplace().Блок памяти, в котором вы выделяете класс, может быть создан, например, с помощью core.stdc.malloc().Однако обратите внимание, что вам придется вызывать GC.addRange(), если класс может содержать указатели на выделенную GC память.

1 голос
/ 26 августа 2010

(Отказ от ответственности: я программист D 1.0, не так уж много D 2.0)

В глубине души вы можете использовать любую функцию, которую хотите выделить для памяти в D. В D 1.0 вы можете переопределить новый оператор для классов и распределить их память так, как вы хотите;Я полагаю, что это удаляется в D 2.0, однако.

Вы, безусловно, можете malloc памяти для экземпляра класса, инициализировать его соответствующим образом и затем привести к ссылке на объект (хотя будьте осторожны со скрытой ссылкой на монитор).

В более экстремальном случае вы всегда можете заменить GC оболочкой malloc, которая требует, чтобы вы управляли всем вручную (хотя я считаю, что только D 1.0 + Tango делает это менее болезненно болезненным.)

В конце концов, D на самом деле не волнует, как и где размещаются экземпляры вашего класса;ссылка на класс - это просто указатель в платье.Только не используйте delete для объекта, который вы не выделяете через new.

0 голосов
/ 08 сентября 2010

Мне любопытно, почему вам конкретно нужны экземпляры классов, управляемые вручную. Не пытаясь застрелить тебя, мне просто нужно понять, прежде чем я действительно смогу ответить. Есть ли причина, по которой структура не будет соответствовать вашим потребностям? Эти объекты выходят за рамки их создания? Это просто вопрос частого создания / уничтожения, где использование свободного списка может быть решением?

0 голосов
/ 03 сентября 2010

В двух предыдущих ответах был использован подход, объясняющий, что такое возможности D, а какие нет, в отношении управления памятью.Я не уверен, что они отражают суть вопроса.

Но что касается вопроса о том, как легко добиться ручного управления памятью.Я бы сказал, используйте C-версию malloc () и free () из std.c.stdlib .Все, что будет выделено этим, будет игнорироваться GC.

Перегрузка нового для ваших классов, возможность использовать C stdlib.

В противном случае вы можете использовать данные typeinfo для ручной memcpyБайт-массив ClassInfo.init в управляемую вручную память.Вызов ctor с таким подходом может быть сложным, но вы можете просто решить использовать обычную функцию вместо стандартного имени ctor.

Затем оберните все это в несколько удобных шаблонов, и все готово.

Примечание: я тоже сотрудник D1.

...