内联扩展

内联扩展是编译代码中的常见优化,它优先考虑二进制大小的性能。它允许编译器用函数的实际主体替换函数调用; 在编译时有效地将代码从一个地方复制/粘贴到另一个地方。由于调用站点被扩展为仅包含编译器为函数生成的机器指令,因此我们不必执行 CALL 或 PUSH(GOTO 语句或堆栈帧推送的 x86 等效项)或其他等效项。架构。

内联器根据一些启发式方法决定是否内联函数,但通常默认情况下为 Go inlines。因为内联器摆脱了函数调用,所以它有效地决定了允许调度程序在哪里抢占 goroutine。

如果满足以下任何条件,则不会内联函数调用(还有许多其他原因,此列表不完整):

  • 函数是可变的(例如,他们有 ... args)
  • 功能的最大毛茸茸大于预算(它们递归过多或因其他原因无法分析)
  • 它们包含 panicrecoverdefer