gpt4 book ai didi

c++ - 为什么内联被认为比函数调用更快?

转载 作者:IT老高 更新时间:2023-10-28 12:29:31 28 4
gpt4 key购买 nike

现在,我知道这是因为调用函数没有开销,但调用函数的开销真的那么重(并且值得将其内联的臃肿)?

据我所知,当一个函数被调用时,比如 f(x,y),x 和 y 被压入堆栈,堆栈指针跳转到一个空 block ,并开始执行。我知道这有点过于简单化了,但我错过了什么吗?几次推送和跳转调用一个函数,真的有那么大的开销吗?

如果我忘记了什么,请告诉我,谢谢!

最佳答案

除了没有调用(因此没有相关费用,例如调用前的参数准备和调用后的清理)这一事实之外,内联还有另一个显着优势。当函数体被内联时,它的主体可以在调用者的特定上下文中重新解释。这可能会立即让编译器进一步减少和优化代码。

举个简单的例子,这个函数

void foo(bool b) {
if (b) {
// something
}
else {
// something else
}
}

如果作为非内联函数调用,则需要实际的分支

foo(true);
...
foo(false);

但是,如果上述调用是内联的,编译器将立即能够消除分支。本质上,在上述情况下,内联允许编译器将函数参数解释为编译时常量(如果参数是编译时常量)——这对于非内联函数通常是不可能的。

但是,它甚至不仅限于此。一般来说,内联启用的优化机会要深远得多。再举一个例子,当函数体被内联到特定调用者的上下文中时,编译器通常能够将调用代码中存在的已知别名相关关系传播到内联函数代码中,从而可以更好地优化函数的代码。

同样,可能的例子很多,所有这些都源于内联调用沉浸在特定调用者的上下文中的基本事实,从而实现了各种上下文间优化,这是不可能的与非内联调用。通过内联,您基本上可以获得原始函数的许多单独版本,每个版本都针对每个特定的调用者上下文单独定制和优化。显然,这样做的代价是代码膨胀的潜在危险,但如果使用得当,它可以提供显着的性能优势。

关于c++ - 为什么内联被认为比函数调用更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4016061/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com