2016 - 2024

感恩一路有你

什么情况下适宜调用内联函数 c语言类型说明符有哪些?

浏览量:3584 时间:2023-06-23 18:44:32 作者:采采

c语言类型说明符有哪些?

inlineintfoo(inta,intb){returnab}intmain(intargc,char*argv[]){return(1,2)

*ANSIC,ISO/IECC89/C90:标准中没有inline关键字.

*GNUC89/C90:

1、staticinline:函数名标识符的作用域为当前编译器单元(translationunit),容许其他编译单元中有重名定义.这里的inline建议您编译器,函数在被动态创建时也可以再发动了攻击函数体,但有无发动了攻击取决于你编译器.(再者,要是优化级别为-O0,则可以按函数地址内部函数,此时编译器会忽略inline跪请,将函数程序编译为普通地函数;或者,又出现了递归函数动态链接库,编译器也无法内联这个函数)

2、inline:在当前程序编译单元内,和staticinline语义同一,大都个人建议编译器在当前程序编译单元内展开函数体(有无发起取决于编译器).但而编译器会对该函数生成气体一份普通地函数的代码,在其他编译单元内这个可以调用,与特殊的extern函数调用大异.

3、externinline:非常诡异.这样的函数定义只为内联而能提供.如果不是全力用大多数函数调用内部函数该函数(正如,360优化级别为-O0,也可以按函数指针动态链接库),则链接地址器会如果说未知一个小说改编的特殊函数.如果没有没有这个同名作品普通地函数的定义,则音乐链接器会报告一直找不到符号.

*ISO/IECC99/C11:

1、staticinline:和GNUC89/C90中的语义彻底是一样的.

2、inline:很带有GNUC89/C90中的externinline.标准文档中的解释相当晦涩:不能(但不没有要求)编译器在当前编译单元内展开攻击函数体(原文的描述是“而言正常了的函数调用机制,让内联函数动态创建尽可能会快”,而文档下面的脚注中提到,很有可能的选择是“内联替换”,见ISO/IEC9899:1999或ISO/IEC9899:2011),是否需要内联由编译器设计者让其判断,同样的也不允许外部必然同名的普通地函数定义.经测试2012版版本的Clang和GCC在标准-stdc99和-stdc11下会在这个可以内联的情况下(比如优化级别为-O2)需要内联版本.

3、但标准文档中另外也相关规定了,若在函数声明中加入extern,则或则的内联函数定义成为说白的外部定义,行为和GNUC89/C90的inline不同:在当前编译程序单元中见意编译器展开攻击函数体,而能生成一份普通地函数的代码,在其他编译单元中也可内部函数.

4、externinline:标准文档中久不见externinline的定义.

*GNUC99/C11:区分与ISO/IECC99/C11是一样的的语义.

最新版本的Clang和GCC默认均区分GNUC11标准,所以会再次出现不优化代码时找不到内联函数符号的错误

编译器如何处理printf这种语言自带的函数?

从其它编程者的想法这些函数应该是是用C语言本身的关键字变量内部函数系统API等等措施利用的但有些时候是因为效率考虑不肯定会是这样诸如strncpy这种函数大多数都绝对不会一个字节一个字节的文件复制而会判断四字节四字节拷入(32位)甚至于批量改u盘拷贝(大概ARM指令如此做)这些代码会用内联汇编c语言设计常见都是经由标准库开发者深度优化过的代码能继续发挥指令集的优势并且力争最简算法编译器会再把这块的代码转换成机器码调用的时候编译器真接链接内部函数

是从一个小程序来说明,见图一。编译后的汇编代码见图二。

可以猜想,sprintf和可以自定义的函数都被编译程序成了汇编代码。

printf是c语言标住控制输出库的函数,初学者的最爱。你经常用这个输出来调试信息。但是现代程序设计其实这个函数很容易缓冲泻出使用的是strcpy这个函数。别外才是有经验的程序设计者要能学会可以使用日志输出函数库辅助设计而不是什么简单的可以使用sprintf这种函数。

函数 编译器 标准 代码 程序

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。