知识卡片
越界可提前发现
内容
数组长度是类型的一部分,编译器能在部分场景提前发现越界或优化边界检查。固定形状的数据结构让编译期掌握更多事实,也给运行时少留一点不确定性。
参考来源
- 位置:《Go语言底层原理剖析》第6章《数组》6.3.4节《数组索引与访问越界原理》
- 结论依据:原文说明"使用未命名常量索引访问数组时,例如a[3],数组的一些简单越界错误能够在编译期间被发现",而"如果使用变量去访问数组……编译器无法发现对应的错误,因为变量的值随时可能变化";对于命名常量索引,原文进一步用 SSA 的 IsInBounds 指令说明编译器能在编译时插入越界检查,因此可以推出"数组长度是类型的一部分,常量下标越界可在编译期发现,变量下标只能运行时检查"的结论。
- 原始内容:数组访问越界是非常严重的错误,Go语言中对越界的判断有一部分是在编译期间类型检查阶段完成的……使用未命名常量索引访问数组时,例如a[3],数组的一些简单越界错误能够在编译期间被发现。但是如果使用变量去访问数组或者字符串,编译器无法发现对应的错误,因为变量的值随时可能变化……如果数组的索引是命名常量,那么仍然能够在编译时通过优化检测出越界并在运行时报错。