编译期约束Compile-time contracts
把编译期可判断的类型或布局条件写成静态检查。
- 核心约束
- 检查表达式必须准确反映接口可静态验证的前提。
- 适用问题
- 底层容器、泛型库、内存布局与类型安全接口。
- 边界与取舍
- 不能证明指针有效性、运行时数据和并发安全;错误约束也会漏报或误报。
常见操作#
以 Linux container_of 的类型检查和 C 静态断言为例。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 编译期检查 | 由类型系统、模板 / 宏展开及编译器决定 | 只检查编译期能表达的属性,不能证明任意运行时对象都仍然有效。 |
| 运行时取回容器地址 | container_of 按固定成员偏移运算;静态断言本身不生成运行时分支。 |
实施成本#
- 时间成本
- 静态约束的成本在编译阶段;实际代码路径另计
- 空间成本
- 静态断言不要求运行时对象状态
类型相容不等于指针生命周期正确。编译期约束可提前阻止一类错误,但不代替所有边界检查和动态校验。
工程中的应用#
1 个案例 · 附源码Linux 把 list_head 嵌入业务对象,通过成员偏移找回宿主,并在编译期检查指针类型。
附源码片段 · 内存管理
原始实现与接口资料
Linux 6.12 · container_of.hstatic_assert、类型相容判断和按偏移恢复容器地址。