Hasty Briefsbeta

双语

Error ABI

6 months ago
  • #error-handling
  • #Rust
  • #ABI
  • 使用代数数据类型(ADT)表示错误时,由于庞大的错误对象会增大`size_of<Result<T, E>>`,可能导致正常路径的性能下降。
  • 成熟的错误处理库(如Rust的`failure`和`anyhow`)通过瘦指针隐藏错误来缓解ABI问题,但这需要全局分配器的支持。
  • 返回结果的三种潜在ABI方案:默认方案(寄存器/栈传递)、优化方案(为`E`预留寄存器)、栈展开方案(跳转至错误恢复地址)。
  • 根据基准测试及Joe Duffy博客等相关资料显示,栈展开机制可能是最优的错误ABI方案。
  • 编译器需要感知错误ABI,其表层语义会因语言抽象能力的不同而产生差异。