知识卡片

越界可提前发现

普通读书笔记卡 · 1472.a

内容

数组长度是类型的一部分,编译器能在部分场景提前发现越界或优化边界检查。固定形状的数据结构让编译期掌握更多事实,也给运行时少留一点不确定性。

参考来源

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