Ⅰ 内联函数的定义对编译器而言必须是可见的什么意思
解答其实已经说得很清楚了,编译器在看到程序中调用普通函数的代码时,是在这里填一个函数的地址,然后在执行时跳转到函数那边去。而碰到内联函数时,是将函数的内容全部在调用点展开,所以它必须知道这个内联函数的定义是什么,否则无法展开。而将内联函数的定义放在头文件(.h)中,一旦include了该头文件,就能看到内联函数的全部内容了,也就可以在调用点完全展开内联函数。如果将内联函数放在源文件中(.c),编译器在看到内联函数的调用时,是无法知道内联函数的内容的,因此也无法展开,所以必须将内联函数定义在头文件中。
Ⅱ 什么是内联函数
在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。
内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。
没有了内联函式,程式员难以控制哪些函数内联哪些不内联;由编译器自行决定是否内联。加上这种控制维度准许特定于应用的知识,诸如执行函式的频繁程度,被利用于选择哪些函数要内联。
此外,在一些语言中,内联函数与编译模型联系紧密:如在C++中,有必要在每个使用它的模块中定义一个内联函数;与之相对应的,普通函数必须定义在单个模块中。这使得模块编译独立于其他的模块。
(2)编译器内联函数扩展阅读:
在C++中我们通常定义以下函数来求两个整数的最大值:
代码如下:
int max(int a, int b)
{
return a > b ? a : b;
}
为这么一个小的操作定义一个函数的好处有:
① 阅读和理解函数 max 的调用,要比读一条等价的条件表达式并解释它的含义要容易得多
② 如果需要做任何修改,修改函数要比找出并修改每一处等价表达式容易得多
③ 使用函数可以确保统一的行为,每个测试都保证以相同的方式实现
④ 函数可以重用,不必为其他应用程序重写代码
虽然有这么多好处,但是写成函数有一个潜在的缺点:调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复,复制实参,程序还必须转向一个新位置执行
C++中支持内联函数,其目的是为了提高函数的执行效率,用关键字 inline 放在函数定义(注意是定义而非声明,下文继续讲到)的前面即可将函数指定为内联函数,内联函数通常就是将它在程序中的每个调用点上“内联地”展开。
内联函数应该在头文件中定义,这一点不同于其他函数。编译器在调用点内联展开函数的代码时,必须能够找到 inline 函数的定义才能将调用函数替换为函数代码,而对于在头文件中仅有函数声明是不够的。
当然内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的),当然即使是放在头文件中,也是对每个定义做一份拷贝,只不过是编译器替你完成这种拷贝罢了。
但相比于放在源文件中,放在头文件中既能够确保调用函数是定义是相同的,又能够保证在调用点能够找到函数定义从而完成内联(替换)。
Ⅲ C++内联函数具体有什么作用
内联函数可减少cpu的系统开销,并且程序的整体速度将加快,但当内联函数很大时,会有相反的作用,因此一般比较小的函数才使用内联函数。
内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。
值得注意的是,内联函数仅仅是对编译器的内联建议,编译器是否觉得采取你的建议取决于函数是否符合内联的有利条件。如何函数体非常大,那么编译器将忽略函数的内联声明,而将内联函数作为普通函数处理。
内联函数具有一般函数的特性,它与一般函数所不同之处公在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。在使用内联函数时,应注意如下几点:
1、类内定义的函数是内联函数,类外定义的函数是非内联函数(短函数可以定义在类内,长函数可以定义在类外)。
2、可以为类外定义的函数指定 inline 关键字,强行为内联函数。
3、在内联函数内不允许用循环语句和开关语句。
4、内联函数的定义必须出现在内联函数第一次被调用之前。
Ⅳ C++编译器(Dev-C)是否会自动内联函数 对于什么样的函数即使标记inline也会拒绝内联
G++编译器是否会自动进行内联函数?
G++编译器是很先进的,编译的时候如果开启优化,G++会代码进行各种优化,如:对合适的函数进行内联(即便是没有添加inline关键字),对某些函数直接对其进行求值,除此之外G++编译器还可以对代码进行重排序 等等。编译器比你更了解硬件,所以只要允许它优化,他会尽量进行优化。你使用的Dev C++集成开发环境使用的c++编译器就是G++。
什么样的函数即使标记inline也无法内联?
比如函数体太大、太复杂的话(比如包含多重循环、包含递归调用),对其进行内联得不偿失,这时编译器就会忽略inline关键字,VC++编译器提供了强制内联函数的关键字,除非你非常了解硬件,不然最好让编译器来处。编译不对那些函数进行内联要看具体的编译器实现了。
inline关键字的有哪些作用?
inline关键字可以提示编译器对某个函数进行内联,并且强制函数使用内部链接。比如说你在头文件定义了某个函数,为了防止多重定义,你可以添加inline关键字来防止多重定义错误。
如果对硬件不是很了解,底层的代码优化还是留给编译器来处理。
看看下面的几个编译器优化函数的例子:
1.编译器直接对函数求值:
解释一下:
第一条和第二天指令分别将b和a的地址加载到寄存器rdx和rcx中
第三条指令将b的值加载到eax寄存器中
第四条指令将34存入b中
第五条指令将eax的值加1(eax保存了之前b的值)
第六条指令将eax的值存入a中
可以看出编译器将函数的两条语句换了位置,这种优化主要是优化代码的执行速度,有的CPU内存读写操作的的开销不一样,所以重新排序一下某些代码能够提高程序执行速度。