我正在编写一个调试函数,它将从我项目中的其他函数调用。此功能标记为@inline(__always)
,如果DEBUG
为0
则不执行任何操作。
此功能在DEBUG == 0
是否有任何费用?我很确定答案是肯定的,但我只想确认一下。
答案 0 :(得分:0)
零费用?
我假设您的函数看起来像这样:
@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,但最终结果是相同的。