《三内联函数inlinefunction四引用和数值传递方式具体》由会员分享,可在线阅读,更多相关《三内联函数inlinefunction四引用和数值传递方式具体(21页珍藏版)》请在金锄头文库上搜索。
1、三、内联函数三、内联函数(inline function)(inline function)四、引用和数值传递方式具体比较四、引用和数值传递方式具体比较主撕我关眼免杠牢砰援惩匹律捣乒澳富濒卤者嘎痞尝响泼疲担认拒侠馈敝三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体1三、内联函数三、内联函数(inline function) C+(C99)新增的关键字新增的关键字inline修饰的函数称为内联函修饰的函数称为内联函数。内联函数的语法格式与普通函数一样,只是在函数原型数。内联函数的语法格式与普通函数一样,只是在函数原型或函
2、数定义的标题头之前加上关键字或函数定义的标题头之前加上关键字inline。格式为:。格式为: inline type function (type1 parm1, type1 parm2,. typen parmn)语句序列语句序列; 关键字关键字inline 通知编译器用内联函数体中的函数代码在通知编译器用内联函数体中的函数代码在虚实结合的时候取代函数调用,调用一次就替换一次。这种虚实结合的时候取代函数调用,调用一次就替换一次。这种替换经过参量之间类型匹配合适性的检查。替换经过参量之间类型匹配合适性的检查。 内联函数虚实结合处发生的替换称为内联展开,内联展内联函数虚实结合处发生的替换称为内联
3、展开,内联展开的结果是程序代码的扩大但执行的时间减少从而效率趋开的结果是程序代码的扩大但执行的时间减少从而效率趋快。快。嫩总擂项须阐苇萍糕氧锚蕉位霹盗灌僳常脱壁典蚜查雇薄敏辈狡荤袁答颂三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体2 关键字关键字inline是对编译器的优化建议,通常只是对于短是对编译器的优化建议,通常只是对于短小的函数才执行了实际的函数体代码替换。小的函数才执行了实际的函数体代码替换。 内联函数力图减少函数调用的堆栈空间之间的调转损内联函数力图减少函数调用的堆栈空间之间的调转损耗。递归函数、可变参量
4、的函数以及涉及到复杂指针运算的耗。递归函数、可变参量的函数以及涉及到复杂指针运算的函数难以内联展开。函数难以内联展开。 编译器对于编译器对于inline展开采取复杂的指标,一旦满足这些展开采取复杂的指标,一旦满足这些指标,真实的扩展在函数的调用点进行。为便于内联函数的指标,真实的扩展在函数的调用点进行。为便于内联函数的真实展开,真实展开,inline函数的定义一般应放置在调用点之前。函数的定义一般应放置在调用点之前。 C+引入引入inline函数的原因一是破除函数的原因一是破除private或或protected关键字导致的封装弊端,二是减少宏展开的副作用。宏展开关键字导致的封装弊端,二是减少
5、宏展开的副作用。宏展开是由是由#define预处理指令引入的代码重用的机制。预处理指令引入的代码重用的机制。破化痹沏识伍糊洱抱袁依上衡忘撒慕懊限茅廖陵闺林稻区常罩堑侮恿凶磋三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体3例例 swap函数仅交换函数函数仅交换函数 例例 内层块交换内层局部内层块交换内层局部局部变量的值局部变量的值 变量的值变量的值#include #include inline void swap (int x,int y) void main (void) int t=x; x=y; y=t; in
6、t a=1,b=2; printf (%d,%d;,x,y); int x=a; int y =b;void main (void) int t=x; x=y; y=t; int a=1,b=2; printf (%d,%d;,x,y); swap (a,b); / 内层块是内层块是swap(a,b)的内联展的内联展开开 printf (%d,%dn,a,b); printf (%d,%dn,a,b); 输出结果都为输出结果都为2,1;1,2,可见函数体中形参的变化不影响可见函数体中形参的变化不影响实参变量。实参变量。趟熙秆铭缮拴答层迫窟型渴沃愉俯黍送昌卸处颅肯有傣瘫吓飞崭簿窜乳驮三内联函数i
7、nlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体4 下面两个程序中的下面两个程序中的swap函数交换间接变量的值都输出函数交换间接变量的值都输出1,2 2,1例例 指针的数值形参交换间接变量指针的数值形参交换间接变量 #include inline void swap (int *x,int *y) printf (%d,%d,*x,*y); int t=*x; *x=*y;*y=t; void main (void) int a=1,b=2; swap (&a,&b); printf (%d,%d,a,b); 姐辫逊撒悲魄劈裳奸
8、恍旧戌音尚粮滞甫勇恳疤建舟汕铀吃惰腰瘤蛹扎仟码三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体5例例 内层块交换间接变量的值内层块交换间接变量的值 #include void main(void)/ 左边代码的内联展开左边代码的内联展开 int a=1,b=2; int *y =&b; int* x=&a; printf (%d,%d ,*x,*y); int t=*x; *x=*y; *y=t; /内层块是内层块是swap(&a,&b)的内联展开的内联展开 printf (%d,%d,a,b); 法肝澈惦物都虏乘撞刘
9、吵啥升漏去曳炔林盖眷滥住挟菱诽制手烃咙要悉枫三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体6 考虑到考虑到*(&Lvalue)= Lvalue,上面程序的,上面程序的swap函数调函数调用具体运算步骤可理解为用具体运算步骤可理解为: 函数调用函数调用swap(&a,&b) 触发虚实结合:触发虚实结合: int* x=&a;int *y=&b; 进入函数体:进入函数体: int t*x; *x*y;*yt; 带实参值参入运算:带实参值参入运算: x=&a;y=&b; t*(&a) ; *(&a) *(&b) ;*(&b
10、) t t a ; a b ; b t 运算完毕从被调函数返回。运算完毕从被调函数返回。 雾垒熄涌剂糕丑藕漫驻蓟朔蓬孕赐玲匡通惩弟凰仇阜恫务奋吴雇当代杜葛三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体7 在函数调用时,指针在函数调用时,指针x指向变量指向变量a,*x是变量是变量a的间接变的间接变量。量。 对于间接变量对于间接变量*x的操作就是对于变量的操作就是对于变量a的等价操作。指的等价操作。指针针y指向变量指向变量b,*y是变量是变量b的间接变量。的间接变量。 对于间接变量对于间接变量*y的操作就是对于变量的操作
11、就是对于变量b的等价操作。通的等价操作。通过访问指针形参可以改变主控函数变量的值。过访问指针形参可以改变主控函数变量的值。 杂桓堤俘衣务革奔输凸混遭呛征颈卖狗蔗征布食吻张杭淀凰墅篇荣沈墓肉三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体8四、引用和数值传递方式具体比较四、引用和数值传递方式具体比较 在在C+中参数传递方式分为两种:数值传递方式,引用中参数传递方式分为两种:数值传递方式,引用传递方式。差别在于:传递方式。差别在于: 引用形参可改变实参变量,数值形参不改变同类型或同引用形参可改变实参变量,数值形参不改变同类
12、型或同级别的实参变量。但访问指针数值形参可以改变指针形参指级别的实参变量。但访问指针数值形参可以改变指针形参指向的主控函数的变量,这是间接改变。向的主控函数的变量,这是间接改变。 数值形参对应右值实参,从实参获得初值。引用形参匹数值形参对应右值实参,从实参获得初值。引用形参匹配左值实参。左值可作为右值,右值不作为左值。配左值实参。左值可作为右值,右值不作为左值。域塞粤芥适签毕未综卧尧购孙擦翰锨屁魔谓快轮洗刻铂咽因猫畜陕户箕孪三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体9例例 函数函数f返回返回n的立方,引用形参的立
13、方,引用形参x计算正方形周长,访问计算正方形周长,访问指针指针*p得到正方形面积得到正方形面积#include / 函数调用函数调用z=f(x,&y,3)导致导致x=4*3,*(&y)=3*3, z=3*3*3int f (int & r,int*p ,int n) /引用形参引用形参r匹配左值匹配左值x, 指针数值形参指针数值形参p匹配右值地址匹配右值地址&y r=4*n; *p=n*n; return n*n*n; /变量数值形参变量数值形参n匹配右值匹配右值3void main() int x,y,z; z=f (x,&y,3); printf (%d,%d,%dn,x,y,z); /输
14、出输出:12,9,27时柠走玲狐步梗拥硒娘槛韵狠燎翱耐椿瞥斋淡妆妊把少搂悸密锋海汤氦束三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体10例例 交换变量值的函数。交换变量值的函数。 以下三个程序运行都输出以下三个程序运行都输出:1,2 ;2,11 指针的数值形参版本指针的数值形参版本 #include void swap (int *x,int *y) printf (%d,%d;,*x,*y); int t=*x; *x=*y;*y=t;void main (void) int a=1,b=2; swap (&a,&
15、b); printf (%d,%d,a,b); 仑耕免恨夏循记面邦助隘资挫征理寅泥睬监佃限偏夕琉披绞充越孺疫吐裹三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体112 变量的引用形参版本变量的引用形参版本 #include void swap (int &x,int &y) printf (%d,%d;,x,y); int t=x; x=y; y=t; void main (void) int a=1,b=2; swap(a,b); printf (%d,%d,a,b); 聂溶晶晾顺睹求衰开渴蒙与午兄刑笆蕾撒岭锰宁汪朴
16、湾岔惠朱猫帮屹后姆三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体123 相当于引用版本的内联展开相当于引用版本的内联展开#include void main (void) int a=1,b=2; int& y =b; int& x=a; printf (%d,%d;,x,y); int t=x; x=y; y=t; / swap(a,b)的内联展开的内联展开 printf (%d,%d,a,b);蜂贮洪茸洒晕塔苟皑蘑睹纶匆于蒸份眯甜晴禄枫饱誉竣溶浅鞠岔沽溢印抒三内联函数inlinefunction四引用和数值传递方
17、式具体三内联函数inlinefunction四引用和数值传递方式具体13 指针的传值调用与变量的引用调用在上面的例题中具有指针的传值调用与变量的引用调用在上面的例题中具有相同的作用,站在汇编语言的角度看实际上两者是等价的。相同的作用,站在汇编语言的角度看实际上两者是等价的。 变量的引用传递其数据的流通机制本质上同等于指针固变量的引用传递其数据的流通机制本质上同等于指针固定寻址的数值调用,根据兼容定寻址的数值调用,根据兼容C的的CFRONT策略变量的引用策略变量的引用形参版本幕后转换为指针的数值形参版本。形参版本幕后转换为指针的数值形参版本。 严格地引用形参版本严格地引用形参版本void swa
18、p(int &x,int &y) int t=x; x=y; y=t;概念上对应或映射指针的固定寻址版本即概念上对应或映射指针的固定寻址版本即 void swap(int *const x,int *const y) int t=*x; *x=*y;*y=t; 毯妆荒珊榷刑既同刁凹肌箕刘欠鱼莱怖劫壮投捉骗粟妙儒取奥冷住闻掀决三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体14 上面前两个版本执行文件的大小是一样的。上面前两个版本执行文件的大小是一样的。 表面不同的是:表面不同的是:指针的传值调用中指针的传值调用中 x是
19、指针,作为指针是指针,作为指针的的x可以在程序段中指向不同的变量,函数中采用明朗的间可以在程序段中指向不同的变量,函数中采用明朗的间接访问指针形式。接访问指针形式。 变量的引用传递中变量的引用传递中x在一个程序段中仅与一个变量相关在一个程序段中仅与一个变量相关联,联,x隐约地对应相关变量的地址,采用的是变量名的语隐约地对应相关变量的地址,采用的是变量名的语法。法。注意:注意: void f (int&)与与 void f (int*)在实参的匹配上是不同的。在实参的匹配上是不同的。void f(int&)匹配匹配int型的左值,型的左值,void f(int*)匹配匹配int*型的地址型的地址
20、表达式表达式(右值右值)。 泉明且奥逊真友炙煽瞬她贡苏硼抠捍肌笼朋福镜孵打丘柿栓今盂揖梗装锥三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体15例例求函数极大值求函数极大值1 double*型指针输入和指针返回型指针输入和指针返回 #include double* pmax(double* x,double* y) if (*x*y) return x; else return y; void main (void) double x=100, y=0; *pmax (&x,&y)+=100; printf (x=%f
21、, y=%fn, x,y); /程序输出:程序输出: x=200.000000,y=0.000000奏栗颤砧崔淹辛察轴筏员犹错档沙北郭耘骡厢砾总捌行故簿苞届漾胃雁傣三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体16例例求函数极大值求函数极大值2 double&型引用输入和引用返回型引用输入和引用返回 #include double& rmax (double& x,double& y) if (xy) return x; else return y; void main (void) double x=100, y=
22、0; rmax (x,y)+=100; printf (x=%f,y=%fn,x,y); /程序输出:程序输出: x=200.000000,y=0.000000绒跪玲竞晕塞返龄踪殖典坊谦葡砸雁效泵耳舱畴姥脚融磨捍网硝名豪雕侥三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体17说明:说明: 1例题是双重传值,函数的输入传值,函数的返回也例题是双重传值,函数的输入传值,函数的返回也是传值,操作的变量是是传值,操作的变量是double*型的指针。型的指针。 pmax (&x,&y)是是double*型的右值,型的右值,*pm
23、ax(&x,&y)是是double型的左值。型的左值。 2例题是函数的引用输入与引用返回。两者实现相同例题是函数的引用输入与引用返回。两者实现相同的功能,但引用语法略微简洁。根据兼容的功能,但引用语法略微简洁。根据兼容C的的CFRONT策策略,右边的代码在幕后处理为左边的代码,然后转换汇编语略,右边的代码在幕后处理为左边的代码,然后转换汇编语言代码。言代码。 pmax返回入口形参的指针,实质上返回的是相应实参返回入口形参的指针,实质上返回的是相应实参的地址,这个实参的地址指向主控函数的局部变量的内存的地址,这个实参的地址指向主控函数的局部变量的内存区。变量的引用返回几乎相当于指针的数值返回。区
24、。变量的引用返回几乎相当于指针的数值返回。肾惮定匹迫蠢歼沾鸣最很拄划映隋蓝垄由刮辽么煽惺琼唉殉彝逮崭眩访撅三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体18 与引用相关的变量的生存期对于主控程序应是可访问与引用相关的变量的生存期对于主控程序应是可访问的。确保返回变量引用的函数和返回指针数值的函数操作的的。确保返回变量引用的函数和返回指针数值的函数操作的数据的生存期对于主控函数是存在的是有效的。数据的生存期对于主控函数是存在的是有效的。 引用是已经存在的变量的别名,是不独立存在的变量。引用是已经存在的变量的别名,是不独
25、立存在的变量。引用的值是存储单元中的内容即相关变量的值。对于字符型引用的值是存储单元中的内容即相关变量的值。对于字符型数据,变量和引用的值占数据,变量和引用的值占1字节的单元,对于双精度型的数字节的单元,对于双精度型的数据,占据,占8字节的单元。字节的单元。 对引用的操作是对相关变量的操作。对引用的操作是对相关变量的操作。罪咏弦症谜咖宗拆僻汾佣君泽摸嗜宫秧进坪蔽稠叹长凹俘颅疯砧捧旷秉晶三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体19 指针是地址的独立存在的变量,指针的值是变量的地指针是地址的独立存在的变量,指针的值
26、是变量的地址,是地址的编号,为址,是地址的编号,为4字节或字节或2字节的无符号整数。字节的无符号整数。 指针指针p可以遍历存储单元,对存储单元的内容进行访问可以遍历存储单元,对存储单元的内容进行访问或数据更新。或数据更新。 间接变量间接变量*p的值是相关变量的值,对间接变量的值是相关变量的值,对间接变量*p的操的操作是对相关变量的操作。作是对相关变量的操作。 可以说指针与引用都是变量的别名:可以说指针与引用都是变量的别名: 指针是变量的移动的间接别名,引用是变量的固定的指针是变量的移动的间接别名,引用是变量的固定的直接别名。指针是变动的,可以指向变量、数组、对象,对直接别名。指针是变动的,可以
27、指向变量、数组、对象,对于数据的流通提供了最高的灵活性。引用是凝固的,是指针于数据的流通提供了最高的灵活性。引用是凝固的,是指针与变量的中介,引用保留了指针对数据的快速流通与变量名与变量的中介,引用保留了指针对数据的快速流通与变量名的简洁,是指针与变量典型的混合物。的简洁,是指针与变量典型的混合物。 胶共籍患扁抹扭则映朽知乍抑窟迎卢淋组蓄祝吮次桂瓜紫帮垛炊桨兼哇吏三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体20掩例抄带店积廉柬篱砂称封召叁亮霖者姬感屯柔业踩火贴住洗猩楞参沫秒三内联函数inlinefunction四引用和数值传递方式具体三内联函数inlinefunction四引用和数值传递方式具体21