欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 内联函数例子 哪位高手解释下c++的内联函数,最好写个例子谢谢
内联函数例子 哪位高手解释下c++的内联函数,最好写个例子谢谢
2019-07-24 20:22:21 来源:朵拉利品网

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;
else
return 1;
}
__forceinline int func2()
{
DWORD ct = ::GetTickCount();
if( 0 == (ct % 2) )
return 0;
else
return 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函数的地址放入EDI
call edi ;调用GetTickCount
movzx 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 对象指针放入ECX
movzx eax,al
and eax,1 ;这两句取余2结果
push ecx ;传递参数endl
mov ecx,dword ptr [__imp_std::cout (0CB2038h)] ;读取cout对象
add eax,esi ;完成加法
push eax ;传递参数a + b
call 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是数据库中常用函数中的取整函数,常用来判别一个数能否被另一个数整除。