空内联功能的成本?

时间:2015-06-25 15:35:12

标签: swift function debugging inline

我正在编写一个调试函数,它将从我项目中的其他函数调用。此功能标记为@inline(__always),如果DEBUG0则不执行任何操作。

此功能在DEBUG == 0是否有任何费用?我很确定答案是肯定的,但我只想确认一下。

1 个答案:

答案 0 :(得分:0)

tl; dr

零费用?


阐述

我假设您的函数看起来像这样:

@inline(__always)
func myFunction() {
    #if DEBUG
    doStuff()
    doStuff()
    doStuff()
    #endif
}

首先,遵循预处理器指令。因此,如果您的DEBUG标志是0,则可以认为它是经过预处理的:

@inline(__always)
func myFunction() {
}

在任何地方调用myFunction时,它将在编译时替换为其内容。假设DEBUG仍然是0,可以这样想:

// What you wrote:
func myOtherFunction() {
    print("Before")
    myFunction()
    print("After")
}

// Imagine it becoming this while compiling:
func myOtherFunction() {
    print("Before")
    print("After")
}

而且,如您所见,内联空函数的非内容包括在内,在此编译环境中调用此函数的成本为零。

很显然,Swift代码不会编译成更多的Swift代码。这就是为什么我说你可以想象得到;这不是真的发生了什么。实际上,它被编译为LLVM IR,但最终结果是相同的。