2010-08-07 80 views
3

函数的要求是什么,所以它可以在C++中内联执行? 有没有一个函数不能内联的情况? 或任何函数都可以内联,程序员有责任根据运行时间和编译时间考虑决定如何定义函数?函数在C++中的内联要求

+2

内嵌是onnly一个“请求”的编译器。编译器决定是否内联,通常基于长度和复杂性的考虑,但编译器从不内联任何东西是合法的。请参阅http://stackoverflow.com/questions/1443982/when-do-compilers-inline-c-code – 2010-08-07 14:51:56

回答

3

函数的要求是什么,所以它可以执行 inline in C++?

它需要在每个被调用的地方定义(通常这是通过将其放在.h中完成的)。

是否存在函数不能 内联的情况?

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

或任何功能可内嵌和它 是 程序员的责任来决定如何定义 功能,可以根据运行时间和 编译时间方面的考虑?

inline关键字是刚刚从程序员的编译器,程序员会很喜欢这个功能被内联(可能是程序员已经发现有一个小功能被称为“热”循环实质性调用开销的提示如分析器所示 - 或者,函数非常小以至于与调用代码一样小;-)或者,内联函数允许“跨函数边界优化”,以便特定编译器无法识别或可以否则不执行 - 等等)。

编译器可以自由地忽略只是因为它是免费的忽略老register提示为变量的存储类的提示(我相信时下最优化的C++编译器忽略register但很少忽略inline) - 督察,编译器可以自由地内联全部或部分调用函数,而不管该函数是否被声明为inline。 (当然,当它们通过一个显式指针指向某些点隐藏并在其他位置使用的函数时完成时,或者当函数的地址作为参数传递给它时,它不会“内联调用”一些其他函数 - 但这可能会影响特定调用的内联,而不一定是其他调用相同函数的调用不同)。

“以防万一”你的编译器需要你inline提示很认真,它往往是值得衡量的代码大小和速度与不inline左右(除非你的编译器提供了一个选项/标志为目的,只是一种#define inline肯定会“禁用“inline的效果,从而允许这种测量)。但是如果你打算在多个编译器上部署你的代码,对于多种体系结构,请注意,考虑到CPU架构中编译器的优化策略的差异,在一个平台上产生的积极影响可能会在另一个平台上产生反作用。

5

这取决于你的意思。如果你的意思是,什么时候该函数可以在线扩展,删除一个函数调用,那么这真的取决于编译器。它可能内联几乎所有函数,并拒绝内联几乎所有你要求的函数。可能不会内联的函数包括递归函数,以及您已经使用函数地址的函数。总的来说,最好不要考虑这个问题。

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

+2

+1。但是许多递归函数*可以实际内联(特别是,但不限于尾递归函数)。 – 2010-08-07 15:20:49

1

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

它是基于某些条件的编译器使用函数作为内联函数。

4

函数的需求是什么,所以它可以在C++中内联执行?有没有一个函数不能内联的情况?

内联函数只是函数调用被实际代码替换的函数。如果按照该定义进行操作,则可以手动复制和粘贴代码,并且它将“内联”。但是,这并不总是一个好主意:这是速度与程序大小的问题。随着功能越来越大,使其内联的好处减少了。

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

通常,当您使用inline关键字时,它只是一个请求,编译器会选择是否实际进行内联函数调用。许多编译器还提供了一种强制内联函数的方法(例如,MSVC的关键字为__forceinline) - 在这种情况下,编译器不会很聪明,因此您应该权衡制作函数内联。

+3

即使'__forceinline'在所有情况下都不起作用 - 考虑不能被重构为递归的递归函数。在这种情况下,只能对内部函数的外部调用进行内联,而不能对随后的调用(对其本身)进行内联。 – 2010-08-07 15:22:22

+0

@Konrad:没错,我没有想到。 – casablanca 2010-08-07 17:43:14

+0

是的,__forceinline实际上并不强制编译器内联。 – Puppy 2010-08-07 17:50:07

1

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