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);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现