0
点赞
收藏
分享

微信扫一扫

d的GC与非GC

​​原文​​

class GCAllocated {
float[] data;

this() {
// 非垃集分配字段
this.data = cast(float[])(core.stdc.stdlib.malloc(nBytes)[0 .. nBytes]);
}
}

void foo() {
auto obj = new GCAllocated(); // 垃集分配
...
}

​float[]​​​不包含​​指针​​​,因此​​GC​​​闲着.
扫描时,​​​GC​​​会看到​​data.ptr​​​指针,但不会​​扫描​​​它的区域,因为它不在​​GC​​​区间内(​​运行时​​​可区分​​托管​​​指针和​​其他​​​指针).
扫描后,如果​​​obj​​​不可访问时,​​GC​​​析构它,但这不会回收​​data.ptr​​​,因为它知道它​​不拥有​​​它.
在D中,​​​切片​​​的所有权​​完全​​​由它指向的​​内存区域​​​决定.
如果指向​​​GC​​​内存,则它就是​​GC​​​切片.
​​​简短​​​回答:是的,​​GC​​​闲着.
长答案:即使​​​GC​​​想干啥,又怎么可能呢?它没有​​如何分配​​​的信息.就​​GC​​​而言,就像​​其他数组​​​,它只是​​指针+大小​​​对,且指针恰好指向​​GC​​​分配​​内存​​​之外.除此外,​​GC​​​对指针一无所知.是​​malloc​​​分配的吗?是​​静态内存​​​吗?用户​​自定义​​​分配器吗?​​随机​​​垃圾值吗?谁知道.​​GC​​​对指针一无所知,因此​​保守​​地忽略它.

​D​​​的​​GC​​​是保守的,即如果​​对齐指针​​​大小值可能是​​指针​​​,则​​GC​​​会小心假设它​​*是*指针值​​​,并标记指向​​GC​​​内存的为​​活动​​​指针.值可以是​​int​​​或​​long​​​,​​GC​​​不知道.(不过,最近的​​精确​​​实现可能会跳过一些误报.)同样原则也适用:如果​​指针​​​有​​GC​​​不知道的值(即,未知的​​GC​​​块),则​​GC​​保守地忽略它.

​void[]​​​可能包含指针,​​float[]​​​不包含,因此不会扫描它.或至少​​不应​​​.因而尽量少用​​void[]​​.

void main()
{
import std.stdio;
auto voidArray = typeid(void[]);
auto floatArray = typeid(float[]);
writeln(voidArray.next.flags() & 1 );
writeln(floatArray.next.flags() & 1);
}


举报

相关推荐

0 条评论