内联扩展
内联扩展是编译代码中的常见优化,它优先考虑二进制大小的性能。它允许编译器用函数的实际主体替换函数调用; 在编译时有效地将代码从一个地方复制/粘贴到另一个地方。由于调用站点被扩展为仅包含编译器为函数生成的机器指令,因此我们不必执行 CALL 或 PUSH(GOTO 语句或堆栈帧推送的 x86 等效项)或其他等效项。架构。
内联器根据一些启发式方法决定是否内联函数,但通常默认情况下为 Go inlines。因为内联器摆脱了函数调用,所以它有效地决定了允许调度程序在哪里抢占 goroutine。
如果满足以下任何条件,则不会内联函数调用(还有许多其他原因,此列表不完整):
- 函数是可变的(例如,他们有
...
args) - 功能的最大毛茸茸大于预算(它们递归过多或因其他原因无法分析)
- 它们包含
panic
,recover
或defer