D中的非托管内存管理

时间:2010-08-26 08:09:24

标签: memory-management garbage-collection unmanaged d

避免在D中使用GC的最佳方法是什么?有没有办法使用不涉及其内存管理的类,或者你必须像在C和C ++中那样使用指向malloc的结构的指针?

4 个答案:

答案 0 :(得分:3)

很久以前,由于slicing problem,类需要成为引用类型。另一方面,D是一种系统语言。因此,使用具有手动内存管理的类是丑陋但可行的。

在D2 + Phobos中,您可以(不安全地)使用std.typecons.scoped()在堆栈上分配类实例。您可以(再次,不安全地)使用std.conv.emplace()在任意内存块中分配一个类。例如,可以使用core.stdc.malloc()创建分配类的内存块。但是,请注意,如果类可能包含指向GC分配内存的指针,则必须调用GC.addRange()

答案 1 :(得分:1)

(免责声明:我是D 1.0程序员,而不是D 2.0)

从本质上讲,你可以在D中使用你想要分配内存的任何函数。在D 1.0中,你可以override the new operator获取类,并根据需要分配内存;我相信这在D 2.0中被删除了。

你可以为类实例创建malloc内存,根据需要初始化它,然后转换为对象引用(尽管请注意隐藏的监视器引用)。

在一个更极端的情况下,你总是可以用一个malloc包装器来替换GC,这需要你手动管理所有东西(尽管我相信只有D 1.0 + Tango才能让它变得不那么痛苦。)

在一天结束时,D并不关心您的班级实例的分配方式和位置;类引用只是一个连衣裙中的指针。只是不要在未通过delete分配的对象上使用new

答案 2 :(得分:0)

之前的两个答案采用的方法是在内存管理方面解释D的功能是什么以及它们不是什么。我不确定他们是否抓住了问题的本质。

但是关于如何轻松实现手动记忆管理的问题。我想说,使用来自std.c.stdlib的C版本的malloc()和free()。由此分配的任何内容都将被GC忽略。

为您的类重载新内容,使用C stdlib是可能的。

否则,您可以使用typeinfo数据手动将ClassInfo.init字节数组存储到手动管理的内存中。使用这种方法调用ctor可能很棘手,但您可以决定使用普通函数而不是标准ctor名称。

然后将所有这些包装到一些方便的模板中,然后进行设置。

注意:我也是D1人。

答案 3 :(得分:-1)

我很好奇你为什么特别需要手动管理的类实例。不要试图击倒你,我只能在我真正回答之前理解。结构不适合您的需求是否有原因?这些物体是否逃避了它们的创造范围?它纯粹是一个经常创建/破坏的问题,使用自由列表可能是一个解决方案吗?