
Object、Exception与TypeInfo全解druntime对象体系入门必读【免费下载链接】druntimeLow level runtime library for the D programming language项目地址: https://gitcode.com/gh_mirrors/dr/druntimedruntime 是 D 语言的低层运行时库为每个 D 程序提供对象、异常与类型元数据三大基础设施。本文带你快速看懂 druntime 对象体系的核心三件套Object根类、Exception异常体系与TypeInfo类型系统帮你建立完整的 D 运行时知识框架。 一分钟认识 druntime它到底在干什么简单来说你写的每一行 D 代码编译后都要跑在 druntime 之上对象创建与销毁—— 每个类实例背后都有运行时的分配与释放逻辑异常抛出与捕获——try/catch/throw的底层执行机制运行时类型识别RTTI——typeid、类型转换、反射都靠它好消息是druntime 对象体系的核心 API 几乎全部集中在一个文件里。下面按三件套逐个拆解。1️⃣ Object 根类所有 D 类的老祖宗class Object定义于old/src/object.d约第 104 行是所有 D 类对象的根基。它自带 4 个能力方法作用默认行为toString()转成可读字符串返回类的完全限定名toHash()计算哈希值基于对象地址地址异或右移 4 位opEquals(o)相等性比较只比较身份this is oopCmp(o)排序比较默认直接抛异常另外还有一个静态方法factory(classname)按类名在全部模块中查找TypeInfo_Class再动态创建实例——这是 druntime 反射能力的直接体现。新手提醒默认opEquals只比是不是同一个对象所以两个内容相同的对象用比较通常是false。想要按内容比较需要自己覆写opEquals并添加类型特化的重载。2️⃣ Exception 异常体系D 的错误处理骨架异常相关的类同样集中在old/src/object.d层级非常清晰Object └── Throwable 可抛出的根基类约第 2457 行 ├── Exception 可安全捕获的异常约第 2678 行 └── Error 不可恢复的运行时错误约第 2756 行Throwable 携带哪些信息msg错误消息file/line抛出位置的源码文件与行号info调用栈可foreach遍历也可toString输出nextInChain异常链——在catch块中再抛新异常时原始异常会被链接上去通过静态方法chainTogether管理Exception 与 Error 的关键区别维度ExceptionError语义业务逻辑错误可安全捕获运行时保证被破坏不应捕获构造时记录位置自动记录__FILE__/__LINE__不自动记录位置为空典型例子自定义业务异常OutOfMemoryError、AssertError额外字段—bypassedException被跳过的待处理异常⚠️最佳实践catch (Error e)几乎是坏味道——捕获到 Error 说明运行状态已不可信程序应该尽快终止而不是继续跑。想看看异常测试用例怎么写的参考old/test/exceptions/src/目录里面有chain.d、line_trace.d、assert_fail.d等真实场景。3️⃣ TypeInfo 体系运行时类型元数据引擎TypeInfo是 druntime 中最容易被低估的部分它是RTTI运行时类型信息的载体。typeid(T)表达式返回的就是一个编译期由编译器生成、运行时由 druntime 解释的TypeInfo对象。old/src/object.d中定义了完整的 TypeInfo 家族均为TypeInfo的子类TypeInfo_Class约第 1548 行类的元数据含金量最高——持有类名、虚函数表vtbl、接口列表、基类链、默认构造/析构函数指针以及isBaseOf判断继承关系与create按元数据创建实例TypeInfo_Interface接口元数据配合Interface结构体实现接口调用TypeInfo_Struct结构体成员偏移与类型OffsetTypeInfo数组TypeInfo_Array/TypeInfo_StaticArray/TypeInfo_AssociativeArray各类数组TypeInfo_Pointer/TypeInfo_Delegate/TypeInfo_Function指针、委托、函数TypeInfo_Enum/TypeInfo_Const等枚举及各种限定符包装TypeInfo基类提供了一组能力接口让任何类型的运行时操作统一化tsize/talign类型大小与对齐getHash(p)/equals(p1, p2)/compare(p1, p2)哈希、相等、比较~关联数组、sort底层都靠它swap(p1, p2)类型感知的内存交换destroy(p)/postblit(p)调用析构与后拷贝构造rtInfo给精确 GC 扫描指针用的元数据一图理解关系typeid(MyClass)→TypeInfo_Class对象它既是身份证toString返回类名又是施工图纸GC、反射、动态分发都读它。4️⃣ 三者如何协作一个完整的心智模型把三件套串起来D 的运行时世界就清晰了创建对象→ 分配器依据TypeInfo_Class.m_init与defaultConstructor建出实例实例的虚函数表指向vtbl使用对象→ 虚调用、比较、~关联数组存取背后都是Object的方法与TypeInfo的能力接口出错时→throw一个ExceptionDEH异常展开机制见old/src/rt/deh.d与old/src/rt/dwarfeh.d沿调用栈展开catch到后由toString输出类型名文件(行号): 消息 调用栈其他值得知道的运行时间伴old/src/rt/invariant.d类不变量检查、old/src/rt/cast_.dcast转换实现、old/src/rt/monitor_.d对象监视锁、old/src/rt/minfo.dModuleInfo模块注册表。5️⃣ 源码阅读路线按此顺序入门最快 建议的 druntime 对象体系阅读顺序old/src/object.d—— 核心三件套全部在这里从Object读到TypeInfo_Struct即可掌握 80% 概念old/src/rt/deh.d—— 理解throw/catch如何落地old/src/rt/invariant.d—— 理解invariant声明如何接入构造过程old/test/exceptions/src/—— 通过测试用例反向验证你的理解old/src/core/gc/—— 进阶GC 如何注册与接管对象生命周期注本仓库是 druntime 的归档副本活跃开发已并入 DMD 主仓库的 druntime 目录old/下是完整的源码树适合对照阅读。6️⃣ 新手常见误区清单❌ 以为比较的是内容 —— 默认是身份比较需要覆写opEquals❌ 什么都catch (Exception)—— 会吞掉本该终止的Error❌ 用typeid只做字符串拼接 —— 它是完整的类型引擎isBaseOf、create、swap都是生产级能力❌ 认为异常捕获无代价 —— 展开机制依赖deh逐帧回溯高频路径上应优先用错误码写在最后druntime 的对象体系 Object行为基座 Exception错误契约 TypeInfo类型引擎。看懂old/src/object.d这一个文件你就拿到了 D 语言运行时的一把万能钥匙。接下来不妨打开old/test/目录跑几个测试边跑边读理解会更深。【免费下载链接】druntimeLow level runtime library for the D programming language项目地址: https://gitcode.com/gh_mirrors/dr/druntime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考