9.4 对象、虚表、闭包与捕获变量
这一节讨论两类“晚绑定”机制:
- 对象动态分发(常见实现是 vtable)
- 闭包捕获环境(跨作用域保存变量语义)
它们看起来分别属于 OOP 和函数式特性,但底层共同问题其实是:运行时如何在保持正确语义的同时延后决策。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
虚表槽位为什么要稳定
父类声明的方法在虚表中占据固定槽位。子类覆写时应复用该槽位,而不是打乱顺序。
这样同一个调用点(例如基类指针)才能根据动态类型跳转到正确实现,并保持 ABI 稳定。
新增虚方法通常追加到末尾,避免破坏既有槽位协议。
闭包捕获本质是生命周期问题
当闭包离开定义点后继续存活,被捕获变量是否还有效?这是实现关键。
常见策略:
- 按值捕获:保留创建时快照
- 按引用/共享环境捕获:读取共享位置当前值
不同策略会直接改变可见行为,尤其在后续变量被修改时。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
逃逸变量与环境提升
若捕获变量会逃逸原栈帧,仅靠栈存储会失效。编译器通常要把这些变量提升到堆环境对象或等价结构。
这个变换必须同时保持:
- 生命周期正确
- 别名关系正确
- 变更可见性符合语言承诺
否则就会出现“类型没报错、运行却错”的隐蔽缺陷(bug)。
正在加载概念检查...