【发布时间】:2017-04-28 10:24:11
【问题描述】:
与 C++ 等语言不同,您可以在其中显式声明 inline,在 Go 中,编译器会动态检测可用于内联的函数(C++ 也可以这样做,但 Go 不能两者都做)。还有一个调试选项可以查看可能发生的内联,但是网上很少有关于 go 编译器执行此操作的确切逻辑的文档。
假设我需要每隔 n 周期对一组数据重新运行一些大循环;
func Encrypt(password []byte) ([]byte, error) {
return bcrypt.GenerateFromPassword(password, 13)
}
for id, data := range someDataSet {
newPassword, _ := Encrypt([]byte("generatedSomething"))
data["password"] = newPassword
someSaveCall(id, data)
}
例如,为了使 Encrypt 被正确内联,我需要为编译器考虑什么逻辑?
我从 C++ 中知道,在没有显式 inline 关键字的情况下,通过引用传递会增加自动内联的可能性,但要理解编译器究竟做了什么来确定在 Go 中选择内联或不内联的决定并不容易。例如,如果您使用常量 addSomething($a, $b) 进行循环,那么像 PHP 这样的脚本语言会遭受巨大的损失,其中基准测试这么十亿个循环的成本与 $a + $b(内联)几乎是荒谬的。
【问题讨论】:
-
别太担心。尤其是因为您无能为力,而且您可以使用新编译器每 6 个月更改一次(它可以做更多更好的内联)。