在c中,为了解决一些频繁调用的小函数大量消耗栈空间或是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数数。栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

下面我们来看一个例子
 #include <stdio.h>

inline char* dbtest(int a); //函数原形声明为inline即:内联涵数

int main()

{

int i = 0;

for (i=1;i<=10;i )

{

printf("%d is %s/n",i,dbtest(i));

}

return 0;

}

char* dbtest(int a)//这里不用再次inline,当然加上inline也是不会出错的

{

return (a%2>0)?"奇":"偶";

}

上面的例子就是标准的内联函数的用法,使用inline修饰带来的好处我们表面看不出来,其实在内部的工作就是在每个for循环的内部任何调用 dbtest(i)的地方都换成了(i%2>0)?"奇":"偶"这样就避免了频繁调用函数对栈内存重复开辟所带来的消耗。

说到这里很多人可能会问,既然inline这么好,还不如把所谓的函数都声明成inline,嗯,这个问题是要注意的,inline的使用是有所限制的,inline只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

说到这里我们不得不说一下在c语言中广泛被使用的#define语句,是的define的确也能够做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c 中是不推荐使用define的。

inline函数仅仅是一个建议,对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为你的函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,你声明内联只是一个建议而已.
       其次,因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然,就成了非内联函数的调用了.所以,这要求你的每个调用了内联函数的文件都出现了该内联函数的定义,因此,将内联函数放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦.而你所以声明跟定义要一致,其实是指,如果你在每个文件里都实现一次该内联函数的话,那么,你最好保证每个定义都是一样的,否则,将会引起未定义的行为,即是说,如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定.所以,最好将内联函数定义放在头文件中.
        而类中的成员函数缺省都是内联的,如果你在类定义时就在类内给出函数,那当然最好.如果你在类中未给出成员函数定义,而你又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的.而且刚说了,内联函数最好放在头文件内,所以最好在类定义的头文件里把类的内联函数都实现了.

而你说的将声明与实现分开,其实是不会编译出错的,反正我写那么多程序都没试过.将声明与定义分开的话,这样的后果会带来编译器并不随处可见该函数定义,所以,只能在你实现定义的那个文件里,将该函数看成内联(如果可以内联的话),在其它文件,仍看成是普通函数.

在dsp中会见到这样的用法static inline void CSL_init()

其中static是以前C的用法.目的是让该关键字标识的函数只在本地文件可见,同一个程序的其它文件是不可见该函数的.换句话说,就算你其它文件里包含了同名同参数表的函数定义的话,也是不会引起函数重复定义的错误的.因为static是仅在当前文件可见

extern inline表示该函数是已声明过的了.由于函数本身可以声明多次,所以extern对函数的影响仅仅把函数的隐藏属性显式化了.extern 对于非函数的对象是有用的,因为对象声明时会带来内存的分配,而用 extern就表示该对象已经声明过了,不用再分配内存.

C6000系列DSP的内联函数相关推荐

  1. DSP编程技巧---C/C++与汇编语言的交互之-使用编译器的内联函数

    在C/C++与汇编语言混合编程的情况下,一般我们都会选择C/C++来实现所期待的功能.在我们用C/C++来实现某些位操作.数学运算等功能后,编译器会尽可能地把它们编译为一些已经高度优化的汇编函数(内联 ...

  2. Kotlin系列四:标准函数、扩展函数、高阶函数、内联函数

    目录 一 标准函数 1.1 作用域函数 1.1.1 let 1.1.2  with 1.1.3 run 1.1.4 apply 1.1.5 also 1.1.6 takeIf 与 takeUnless ...

  3. 内联函数和编译器对Go代码的优化

    什么是内联函数 图片版权:Renee French. 在很多讲 Go 语言底层的技术资料和博客里都会提到内联函数这个名词,也有人把内联函数说成代码内联.函数展开.展开函数等等,其实想表达的都是 Go ...

  4. Kotlin学习笔记 第三章 函数 高阶函数 lambda表达式 内联函数

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  5. 内联函数inline

    结论在文章末尾处! 在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 内联函数的处理方式是在函数的调用点直接代码展开.在计算机系 ...

  6. C语言的内联函数的作用

    关内联函数键字inline void myprintf(int a) { priintf("%d",a); } int main() { for(i=0;i<100;i++) ...

  7. Matlab编程与数据类型 -- 内联函数

    本微信图文详细介绍了Matlab中的内联函数.

  8. C++中虚函数可以是内联函数吗?

    1.需要注意的几点: 虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联. 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因 ...

  9. C++中的内联函数inline

    1.Cpp中的内联函数 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方.对内联函数进行任何修改,都需要重新编译函数的所有客户端,因 ...

最新文章

  1. ckeditor java 使用,CKEditor5在自定义数据处理器中使用模型
  2. Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”
  3. 机器学习之五:神经网络、反向传播算法推导
  4. 使用powershell批量导入AD用户
  5. react 组件引用组件_React Elements VS React组件
  6. VS2017安装openGL
  7. 测试停止线程(Java)
  8. UML基本表示法(转载)
  9. 树的存储_ 双亲表示法 及 双亲孩子表示法
  10. python-白盒测试方法
  11. 江苏省淮安市谷歌高清卫星地图下载
  12. 第5节:Tableau堆积图 | 价格等级堆积柱形图
  13. H264码流中NALU sps pps IDR帧的理解
  14. php程序解压的目录在哪,PHP可以解压taz文件吗? (.tar.Z的)
  15. 部门培训之练习今天全部干翻篇
  16. MOS管的介绍与简单应用
  17. $.Event 用法
  18. shell(18) : 替换文件内容
  19. 某游戏大厂员工爆料:米哈游给留守过年员工5000元奖励,网友:我司邮件暗示让为爱发电...
  20. java毕业设计校园考勤系统mybatis+源码+调试部署+系统+数据库+lw

热门文章

  1. 智能车竞赛技术报告 | 基础四轮组 - 哈尔滨工程大学 - 济海追风5队
  2. ESP32-S的UART2的初始化需要注意的问题
  3. 集成两路MAX1169的STC8G1K08模块,带有两路PWM输出
  4. 白白浪费了这满园春色
  5. tp5大数据批量导入mysql_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  6. 表达式类型的实现_程序员如何使代码简洁,Lambda表达式入门之四大引用(下篇)...
  7. java hello work_Java入门教程系列 – 第一个程序 “hello, world”
  8. 全国成人计算机考试题,成人计算机考试试题.docx
  9. 模板设计模式_设计模式-模板方法模式
  10. 结束下面sql块_如何执行超过100M的SQL脚本?