河南 医院 网站建设,免费室内设计网站都有哪些,天津建设工程信息网如何注册,html editor中文版#x1f4d9; 作者简介 #xff1a;RO-BERRY #x1f4d7; 学习方向#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 #x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向#xff0c;欢迎各位关注#xff0c;谢谢各位的支持 目录 1. 前言2.概念3.特性… 作者简介 RO-BERRY 学习方向致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 日后方向 : 偏向于CPP开发以及大数据方向欢迎各位关注谢谢各位的支持 目录 1. 前言2.概念3.特性4.内联与宏 1. 前言
内联函数是C为提高程序运行速度所做的一项改进。常规函数和内联函数之间的主要区别不在于编写方式而在于C编译器如何将他们组合到程序中。要了解内联函数与常规函数之间的区别 必须深入到程序内部。
编译过程的最终产品是可执行程序——由一组机器语言指令组成。运行程序时操作系统将这些指令载入到计算机内存中因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时如有循环或分支语句时),将跳过一些指令,向前或向后跳到特定地址。常规函数调用也使程序跳到另一个地址(函数的地址)并在函数结束时返回。执行到函数调用指令时程序将在函数调用后立即存储该指令的内存地址并将函数参数复制到堆栈为此保留的内存块)跳到标记函数起点的内存单元执行函数代码(也许还需将返回值放入到寄存器中),然后跳回到地址被保存的指令处(这与阅读文章时停下来看脚注并在阅读完脚注后返回到以前阅读的地方类似)。来回跳跃并记录跳跃位置意味着以前使用函数时,需要一定的开销。
C内联函数提供了另一种选择。内联函数的编译代码与其他程序代码“内联”起来了。也就是说编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此内联函数的运行速度比常规函数稍快但代价是需要占用更多内存。如果程序在10个不同的地方调用同一个内联函数则该程序将包含该函数代码的10个副本(参见下图)。 应有选择地使用内联函数。如果执行函数代码的时间比处理函数调用机制的时间长则节省的时间将只占整个过程的很小一部分。如果代码执行时间很短则内联调用就可以节省非内联调用使用的大部分时间。另一方面由于这个过程相当快,因此尽管节省了该过程的大部分时间但节省的时间绝对值并不大,除非该函数经常被调用。 2.概念
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调 用建立栈帧的开销内联函数提升程序运行的效率。 查看方式
在release模式下查看编译器生成的汇编代码中是否存在call Add在debug模式下需要对编译器进行设置否则不会展开(因为debug模式下编译器默认不 会对代码进行优化以下给出vs2013的设置方式) 3.特性
inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会 用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运 行效率。inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同一般建 议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、不 是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性inline不建议声明和定义分离分离会导致链接错误。因为inline被展开就没有函数地址 了链接就会找不到
要使用这些特性必须采取以下几个措施之一
在函数声明前加上关键字inline在函数定义前加上关键字inline
通常的做法是省略原型将整个定义即函数头和所有函数代码放在本应该提供原型的地方 4.内联与宏
inline 工具是C新增的特性。C语言使用预处理器语句#define来提供宏——内联代码的原始实现。例如,下面是一个计算平方的宏:
#define square(x) x*x这并不是通过传递参数实现的而是通过文本替换来实现的——X是“参数”的符号标记。
a square(5.0) --- a 5.0 * 5.0
b square(4.57.5) --- b 4.5 7.5 * 4.5 7.5
c square(s) --- c s * s上述例子只有一个能正常运行其他的均达不到我们想要的目的但是可以通过打括号来进行改进 但很容易出现类似的问题。即宏不能按值传递。 宏的优点 1.增强代码的复用性。 2.提高性能。 缺点 1.不方便调试宏。因为预编译阶段进行了替换 2.导致代码可读性差可维护性差容易误用。 3.没有类型安全的检查 。 内联是传递表达式所以不会出现使用宏所导致的错误 通过对比可以看到内联功能是远远超过宏定义的我们在学习中要多去将以前使用宏定义的地方多去考虑使用内联函数