相关疑难解决方法(0)

刺激代码内联

与像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)
}
Run Code Online (Sandbox Code Playgroud)

目的是为了Encrypt正确地内联编译器需要考虑哪些逻辑?

我从C++中知道,通过引用传递将增加自动内联的可能性,而不使用显式inline关键字,但是要理解编译器确切地确定选择内联与否的决策是什么并不容易.像PHP这样的脚本语言会受到极大的影响,如果你做一个常量循环,addSomething($a, $b)其中基准测试如此十亿次循环它的成本与$a + $b(内联)几乎是荒谬的.

inline go

3
推荐指数
1
解决办法
544
查看次数

标签 统计

go ×1

inline ×1