内联函数有什么要求? [重复]

问题描述 投票:0回答:5

函数需要什么条件才能在 C++ 中内联执行? 是否存在函数无法内联的情况,或者任何函数都可以内联,并且程序员有责任根据运行时和编译时的考虑来决定如何定义函数?

c++ compiler-optimization inline-functions inlining
5个回答
5
投票

这取决于你的意思。如果你的意思是,什么时候可以内联扩展函数,删除函数调用,那么这实际上取决于编译器。它可以内联几乎任何函数,并拒绝内联几乎任何您要求的函数。可能不会内联的函数包括递归函数以及已获取函数地址的函数。总的来说,还是别想那么多比较好。

inline
关键字的主要用途不是请求内联,而是表明该函数可以#included在多个翻译单元中,而不会导致多个定义错误。


4
投票

需要什么条件 函数因此可以被执行 在 C++ 中内联?

需要在调用它的每个位置对其进行定义(通常这是通过将其放入

.h
中来完成的)。

有没有函数不能的情况 内联吗?

我相信,不是就语言标准而言,尽管每个编译器当然可以并且将会实现自己的一些限制。

或者任何函数都可以是内联的 是的责任 程序员决定如何定义 函数,基于运行时间和 编译时考虑因素?

inline
关键字只是程序员向编译器发出的一个提示,表明程序员确实希望内联此函数(大概程序员已经发现在“热”循环中调用一个小函数会产生大量调用开销,如下所示)探查器——或者,该函数非常小,几乎与调用代码一样小;-)——或者,内联该函数允许“跨函数边界优化”,而特定编译器无法发现或无法执行否则——等等)。

编译器可以自由地忽略该提示,就像它可以自由地忽略变量存储类的旧的

register
提示一样(我相信现在大多数优化的 C++ 编译器确实会忽略
register
,但很少会忽略
inline
)——IOW,编译器可以自由内联对函数的所有或部分调用,无论该函数是否已声明
inline

(当然,当它们通过指向在某些点隐藏并在其他点使用的函数的显式指针完成时,或者当函数的地址作为参数传递给其他函数时,它不会“内联调用” - 但这可能会影响特定调用的内联,而不一定会影响以不同方式完成的对同一函数的其他调用)。

“以防万一”,您的编译器非常认真地接受您的

inline
提示,通常值得在有或没有
inline
的情况下测量代码大小和速度(除非您的编译器为此目的提供了选项/标志,只需一个
#define inline
肯定会“禁用”
inline
的效果,从而允许这样的测量)。但是,如果您要跨多个编译器部署代码,尤其是。对于多种架构,请注意,考虑到 CPU 架构中编译器优化策略 的差异,在一个平台上产生的积极影响可能最终在另一个平台上产生反作用。


4
投票

函数需要什么才能在 C++ 中内联执行?有没有函数不能内联的情况?

内联函数只是用实际代码替换函数调用的一种函数。如果您按照该定义,您可以手动复制并粘贴代码,它将是“内联”的。然而,这可能并不总是一个好主意:这是速度与程序大小的问题。随着函数变得越来越大,内联它们的好处就会减少。

或者任何函数都可以是内联的,程序员有责任根据运行时和编译时的考虑来决定如何定义函数?

通常,当您使用

inline
关键字时,它只是一个请求,编译器会选择是否实际使函数调用内联。许多编译器还提供了一种强制函数内联的方法(例如,MSVC 有
__forceinline
关键字) - 在这种情况下,编译器不会试图变得聪明,因此由您来权衡以下优点:使函数内联。


1
投票

或者任何函数都可以是内联的,程序员有责任根据运行时和编译时的考虑来决定如何定义函数?

是编译器根据某些条件将该函数用作内联函数。


1
投票

内联函数取决于代码的长度和代码的复杂性......:) 内联函数只是对编译器的一个请求...

© www.soinside.com 2019 - 2024. All rights reserved.