1, 哪位高手解释下c++的内联函数,最好写个例子谢谢
所谓的内联函数,是指在编译阶段,通过代码复制的方式,用函数体替换调用处的函数名,来达到在运行时减少函数调用所花费的时间,但当函数被多次调用时,付出的代价是代码的冗余增加。内联函数和宏函数类似,相同点在于,都是用函数体去替换函数的调用;但不同点在于,宏函数是在预编译处理阶段就已经完成了替换,而且没有参数类型的检测,仅仅是替换而已,而内联函数则是在编译阶段才完成的替换,而且还和一般函数一样,会校验参数类型是否匹配等。例如:假设定义内联函数 inline void func() {cout << "This is the inline function demo.";}假设主函数中做如下调用:void main() {func();}实际上在编译阶段,就已经把main函数变成了:void main() {cout << "This is the inline function demo.";}不知这样给你讲是否明白?
2, c++内联函数和普通函数的区别在哪里?请举例说明
内联函数和普通函数的区别只有在两个地方有意义:1 考试2 编译器因为到底内联不内联,如何内联,都是编译器说了算。请看如下一段代码:int func1(){DWORD ct = ::GetTickCount();if( 0 == (ct % 2) )return 0;elsereturn 1;}__forceinline int func2(){DWORD ct = ::GetTickCount();if( 0 == (ct % 2) )return 0;elsereturn 1;}int _tmain(int argc, _TCHAR* argv[]){int a = func1();int b = func2();cout return 0;}在Debug时,即使func2被申明为最严格的__forceinline,他也不会内联,反汇编代码为:;int a = func1();call func1 (0F81168h) mov dword ptr [a],eax ;int b = func2();call func2 (0F81163h) mov dword ptr [b],eax 可见func2 并未进入main函数内部。在Release的时候:;int a = func1();mov edi,dword ptr [__imp__GetTickCount@0 (0CB2000h)] ;将GetTickCount函数的地址放入EDIcall edi ;调用GetTickCountmovzx esi,al ;调用结果在EAX中,将EAX地位存在在ESI中and esi,1 ; 相当于取余2的操作;int b = func2();call edi ;再次调用GetTickCount获取时间cout mov ecx,dword ptr [__imp_std::endl (0CB2040h)] ;将endl 对象指针放入ECXmovzx eax,al and eax,1 ;这两句取余2结果push ecx ;传递参数endl mov ecx,dword ptr [__imp_std::cout (0CB2038h)] ;读取cout对象 add eax,esi ;完成加法push eax ;传递参数a + bcall dword ptr [__imp_std::basic_ostream>::operator00CB102E mov ecx,eax 00CB1030 call dword ptr [__imp_std::basic_ostream>::operator可见,两个函数全部被内联了,在func2的内联中,甚至将取余数的操作放在了cout 因此,一般情况下,内联都是编译器说了算,这里情况非常多,你强制它内联,最后结果不一定内联,你不指定内联,他也可能自动内联。有一种情况,如果你将类在.h文件中申明,一部分在.h中实现,并申明强制内联,这部分函数一般会被内联的。
3, 内联函数是作什么用的?
普通函数在调用的时候,会经过压栈跳转运行弹栈这几步操作,其中压栈,跳转,弹栈都增加了额外的开销。而内联函数的函数体直接在调用的地方展开,省去了上面这三步。如果你的函数体语句不多,并且会频繁的被调用,那么就用内联吧。从内联的展开特性上来看,它与宏定义很相似,除此之外它还提供了宏定义锁没有的类型检查,可以带返回值以及方便调试的特性。
4, 内联函数是什么?
定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。简介:“一个函数声明[。。。]说明符声明一个内联与内联函数。内联说明符指示的实现,内联函数体替代了在调用点是首选通常的函数调用机制。一个实现不要求在调用执行此点内联替代,但是,即使这个内嵌替代省略,由7.1.2内联函数定义的其他规则,仍应得到尊重“。注意事项:内联函数具有一般函数的特性,它与一般函数所不同之处只在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。在使用内联函数时,应注意如下几点: 1. 在内联函数内不允许用循环语句和开关语句。 如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码,递归函数(自己调用自己的函数)是不能被用来做内联函数的。内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。 2. 内联函数的定义必须出现在内联函数第一次被调用之前。 3. 本栏目讲到的类结构中所有在类说明内部定义的函数是内联函数。
相关概念
int
INT是将一个数值向下取整为最接近的整数的函数。INT是数据库中常用函数中的取整函数,常用来判别一个数能否被另一个数整除。