Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management D中的非托管内存管理_Memory Management_Garbage Collection_Unmanaged_D - Fatal编程技术网

Memory management D中的非托管内存管理

Memory management D中的非托管内存管理,memory-management,garbage-collection,unmanaged,d,Memory Management,Garbage Collection,Unmanaged,D,避免在D中使用GC的最佳方法是什么?有没有方法使用不涉及内存管理的类,或者必须使用指向Malalc结构的指针(如C和C++中的?< P>(免责声明:我是D 1程序员,而不是D 2))/P> 本质上,你可以在D中使用任何你想分配内存的函数。在D 1.0中,你可以为类分配你想分配的内存;然而,我相信这一点在D2.0中被删除了 您当然可以为类实例调用malloc内存,根据需要对其进行初始化,然后将其转换为对象引用(尽管要小心隐藏的监视器引用) 在更极端的情况下,您总是可以用malloc包装器替换GC,

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

< P>(免责声明:我是D 1程序员,而不是D 2))/P> 本质上,你可以在D中使用任何你想分配内存的函数。在D 1.0中,你可以为类分配你想分配的内存;然而,我相信这一点在D2.0中被删除了

您当然可以为类实例调用malloc内存,根据需要对其进行初始化,然后将其转换为对象引用(尽管要小心隐藏的监视器引用)

在更极端的情况下,您总是可以用malloc包装器替换GC,这需要您手动管理所有内容(尽管我相信只有d1.0+Tango才能让这变得不那么痛苦)


归根结底,D并不真正关心如何或在哪里分配类实例;类引用只是衣服上的指针。只是不要在未通过
new
分配的对象上使用
delete
,很久以前就决定类必须是引用类型,因为。另一方面,D是一种系统语言。因此,使用带有手动内存管理的类是丑陋的,但确实可行


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

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

但是关于如何轻松实现手动内存管理的问题。我想说的是,使用C版本的malloc()和free()。GC将忽略由此分配的任何内容

为类重载new,可以使用C stdlib

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

然后将所有这些内容包装到一些方便的模板中,就完成了


注意:我也是D1人。

我很好奇为什么您特别需要手动管理的类实例。我不是想把你击倒,我只是想在我真正回答之前理解一下。结构不适合您的需要有什么原因吗?这些对象是否正在脱离其创建范围?这纯粹是一个频繁创建/销毁的问题,而使用空闲列表可能是一个解决方案吗?

我不知道切片问题与使非托管内存难看有什么关系。我接受让它们引用类型的理由,但我只想说
fooa=newfoo();删除一条不涉及GC。在D2中不能这样做;它已经/将被特别移除。直接向Andrei Alexandrescu投诉,不能做什么?迪辛查提到了几件事。你是说
scoped
emplace
malloc
已经被删除/弃用了吗?编辑:哦,你是在回应我的评论吗?我知道
delete
已被弃用,但语法并不重要;我只想找到一种方法来轻松分配内存,并在没有GC妨碍的情况下手动解除分配。IIRC,
delete
在D2中被弃用。我需要它们的原因与您需要垃圾收集类实例的原因相同,即,您需要一个具有复杂生命周期的引用语义的对象。手动内存管理部分用于性能/内存使用问题。无论您使用的是GC的内存还是手动管理的内存,内存使用应该相同,或者非常接近,以便没有区别。至于性能,这取决于使用情况。如果由于频繁分配而导致性能下降,则可以轻松使用免费列表。如果由于GC扫描而导致性能下降,那么就没有太多工作要做了——尽管即使是手动分配的类通常也会注册以进行扫描,除非您完全相信没有必要这样做。你有没有测量过GC对你的案例的影响,看看它有多痛?