看里面的代码是说
_ = b[1]
可以用来,让编译器,进行边界检测
但是:
https://play.golang.org/p/SHG6bYjnw8_z
这个是可以运行的,报错也是运行时报错?
panic: runtime error: index out of range
goroutine 1 [running]:
main.main()
/tmp/sandbox468585689/main.go:9 +0x20
1
lujjjh 2018-07-17 21:06:55 +08:00
应该是为了减少运行时的 bounds check 的:
uint16(b[0]) | uint16(b[1])<<8 会生成两条 bounds checks,但是如果先写一个 _ = b[1] 就可以减少一次( b[1] 检查过之后 b[0] 就不用检查了)。 |
2
helloworld12 OP @lujjjh 减少边界检测?不是直接取值吗? 边界检测有什么用, 不是超出范围就崩溃吗?
|
3
lujjjh 2018-07-18 08:51:34 +08:00 via iPhone 2
@helloworld12 之所以能抛出超出范围的 panic,就是因为边界检测的存在。编译器在编译的时候插入边界检测的指令,运行时进行边界检测。并不是像你理解的那样在编译期间做边界检测。
所谓的 bounds check hint to compiler 是提示编译器这里可以优化成只插入一次边界检测,直接检测 b[1] 有没有越界。 编译成汇编代码应该可以看出区别。 |
4
helloworld12 OP 谢谢
|
5
reus 2018-07-18 11:57:17 +08:00
不用看这个,有个 commit 会改进 bounds check elimination,这个会回滚的
|