Go 是否优化了无法访问的 if 语句?
Does Go optimize out unreachable if-statements?
Go 非常不幸地缺乏内置断言。我想这样实现它们:
const ASSERT = true
func SomeFunction() {
if ASSERT && !some_condition_that_should_always_be_true() {
panic("Error message or object.")
}
}
我的问题是,如果我定义 const ASSERT = false
,if 语句会被优化掉吗?
正如人们在对您问题的评论中指出的那样,它是特定于实现的。
gc 确实删除了它。您可以使用 -gcflags '-S'
构建您的程序,并看到 ASSERT
部分不在二进制文件中。
例如用-gcflags '-S'
编译下面的代码,你会看到第8行和第9行的代码被包含进来,但是把Assert
改成false,它们就不会出现在asm列表中了。
package main
const Assert = true
var cond = true
func main() {
if Assert && !cond {
panic("failed")
}
}
编辑:
至于 gccgo,它删除了 -O1
及以上的代码。您可以通过使用
编译相同的代码来查看它
go build -compiler gccgo -gccgoflags '-O1' main.go
然后做
objdump -S main
查看带注释的程序集。
Go 非常不幸地缺乏内置断言。我想这样实现它们:
const ASSERT = true
func SomeFunction() {
if ASSERT && !some_condition_that_should_always_be_true() {
panic("Error message or object.")
}
}
我的问题是,如果我定义 const ASSERT = false
,if 语句会被优化掉吗?
正如人们在对您问题的评论中指出的那样,它是特定于实现的。
gc 确实删除了它。您可以使用 -gcflags '-S'
构建您的程序,并看到 ASSERT
部分不在二进制文件中。
例如用-gcflags '-S'
编译下面的代码,你会看到第8行和第9行的代码被包含进来,但是把Assert
改成false,它们就不会出现在asm列表中了。
package main
const Assert = true
var cond = true
func main() {
if Assert && !cond {
panic("failed")
}
}
编辑:
至于 gccgo,它删除了 -O1
及以上的代码。您可以通过使用
go build -compiler gccgo -gccgoflags '-O1' main.go
然后做
objdump -S main
查看带注释的程序集。