内联函数inlinefunction四引用和数值传递方式具体.ppt_第1页
内联函数inlinefunction四引用和数值传递方式具体.ppt_第2页
内联函数inlinefunction四引用和数值传递方式具体.ppt_第3页
内联函数inlinefunction四引用和数值传递方式具体.ppt_第4页
内联函数inlinefunction四引用和数值传递方式具体.ppt_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1,三、内联函数(inline function) 四、引用和数值传递方式具体比较,第8章 函 数,2,三、内联函数(inline function) C+(C99)新增的关键字inline修饰的函数称为内联函 数。内联函数的语法格式与普通函数一样,只是在函数原型 或函数定义的标题头之前加上关键字inline。格式为: inline type function (type1 parm1, type1 parm2,. typen parmn)语句序列; 关键字inline 通知编译器用内联函数体中的函数代码在 虚实结合的时候取代函数调用,调用一次就替换一次。这种 替换经过参量之间类型匹配合适性的检查。 内联函数虚实结合处发生的替换称为内联展开,内联展 开的结果是程序代码的扩大但执行的时间减少从而效率趋 快。,3,关键字inline是对编译器的优化建议,通常只是对于短 小的函数才执行了实际的函数体代码替换。 内联函数力图减少函数调用的堆栈空间之间的调转损 耗。递归函数、可变参量的函数以及涉及到复杂指针运算的 函数难以内联展开。 编译器对于inline展开采取复杂的指标,一旦满足这些 指标,真实的扩展在函数的调用点进行。为便于内联函数的 真实展开,inline函数的定义一般应放置在调用点之前。 C+引入inline函数的原因一是破除private或protected 关键字导致的封装弊端,二是减少宏展开的副作用。宏展开 是由#define预处理指令引入的代码重用的机制。,4,例 swap函数仅交换函数 例 内层块交换内层局部 局部变量的值 变量的值 #include #include inline void swap (int x,int y) void main (void) int t=x; x=y; y=t; int 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,可见函数体中形参的变化不影响 实参变量。,5,下面两个程序中的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 ( ,6,例 内层块交换间接变量的值 #include void main(void)/ 左边代码的内联展开 int a=1,b=2; int *y = ,7,考虑到*( t*(&a) ; *(&a) *(&b) ;*(&b) t t a ; a b ; b t 运算完毕从被调函数返回。,8,在函数调用时,指针x指向变量a,*x是变量a的间接变 量。 对于间接变量*x的操作就是对于变量a的等价操作。指 针y指向变量b,*y是变量b的间接变量。 对于间接变量*y的操作就是对于变量b的等价操作。通 过访问指针形参可以改变主控函数变量的值。,9,四、引用和数值传递方式具体比较 在C+中参数传递方式分为两种:数值传递方式,引用 传递方式。差别在于: 引用形参可改变实参变量,数值形参不改变同类型或同 级别的实参变量。但访问指针数值形参可以改变指针形参指 向的主控函数的变量,这是间接改变。 数值形参对应右值实参,从实参获得初值。引用形参匹 配左值实参。左值可作为右值,右值不作为左值。,10,例 函数f返回n的立方,引用形参x计算正方形周长,访问 指针*p得到正方形面积 #include / 函数调用z=f(x, /输出:12,9,27,11,例 交换变量值的函数。 以下三个程序运行都输出:1,2 ;2,1 1 指针的数值形参版本 #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 ( ,12,2 变量的引用形参版本 #include void swap (int ,13,3 相当于引用版本的内联展开 #include void main (void) int a=1,b=2; int ,14,指针的传值调用与变量的引用调用在上面的例题中具有 相同的作用,站在汇编语言的角度看实际上两者是等价的。 变量的引用传递其数据的流通机制本质上同等于指针固 定寻址的数值调用,根据兼容C的CFRONT策略变量的引用 形参版本幕后转换为指针的数值形参版本。 严格地引用形参版本void swap(int ,15,上面前两个版本执行文件的大小是一样的。 表面不同的是:指针的传值调用中 x是指针,作为指针 的x可以在程序段中指向不同的变量,函数中采用明朗的间 接访问指针形式。 变量的引用传递中x在一个程序段中仅与一个变量相关 联,x隐约地对应相关变量的地址,采用的是变量名的语 法。 注意: void f (int&)与 void f (int*)在实参的匹配上是不同的。 void f(int&)匹配int型的左值,void f(int*)匹配int*型的地址 表达式(右值)。,16,例求函数极大值 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=200.000000,y=0.000000,17,例求函数极大值 2 double /程序输出: x=200.000000,y=0.000000,18,说明: 1例题是双重传值,函数的输入传值,函数的返回也 是传值,操作的变量是double*型的指针。 pmax (&x,&y) 是double*型的右值,*pmax(&x,&y)是double型的左值。 2例题是函数的引用输入与引用返回。两者实现相同 的功能,但引用语法略微简洁。根据兼容C的CFRONT策 略,右边的代码在幕后处理为左边的代码,然后转换汇编语 言代码。 pmax返回入口形参的指针,实质上返回的是相应实参 的地址,这个实参的地址指向主控函数的局部变量的内存 区。变量的引用返回几乎相当于指针的数值返回。,19,与引用相关的变量的生存期对于主控程序应是可访问 的。确保返回变量引用的函数和返回指针数值的函数操作的 数据的生存期对于主控函数是存在的是有效的。 引用是已经存在的变量的别名,是不独立存在的变量。 引用的值是存储单元中的内容即相关变量的值。对于字符型 数据,变量和引用的值占1字节的单元,对于双精度型的数 据,占8字节的单元。 对引用的操作是对相关变量的操作。,20,指针是地址的独立存在的变量,指针的值是变量的地 址,是地址的编号,为4字节或2字节的无符号整数。 指针p可以遍历存储单元,对存储单元的内容进行访问 或数据更新。 间接变量*p的值是相关变量的值,对间接变量*p的操 作是对相关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论