linux源码中staticinline的分析

linux源码中staticinline的分析

ID:8907418

大小:27.50 KB

页数:7页

时间:2018-04-11

linux源码中staticinline的分析_第1页
linux源码中staticinline的分析_第2页
linux源码中staticinline的分析_第3页
linux源码中staticinline的分析_第4页
linux源码中staticinline的分析_第5页
资源描述:

《linux源码中staticinline的分析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、【赛迪网讯】inline属性在使用的时候,要注意以下两点:inline关键字在GCC参考文档中仅有对其使用在函数定义(Definition)上的描述,而没有提到其是否能用于函数声明(Declare)。从inline的作用来看,其放置于函数声明中应当也是毫无作用的:inline只会影响函数在translationunit(可以简单理解为C源码文件)内的编译行为,只要超出了这个范围inline属性就没有任何作用了。所以inline关键字不应该出现在函数声明中,没有任何作用不说,有时还可能造成编译错误(在包含了sys/co

2、mpiler.h的情况下,声明中出现inline关键字的部分通常无法编译通过);inline关键字仅仅是建议编译器做内联展开处理,而不是强制。在gcc编译器中,如果编译优化设置为-O0,即使是inline函数也不会被内联展开,除非设置了强制内联(__attribute__((always_inline)))属性。1.GCC的inlinegcc对C语言的inline做了自己的扩展,其行为与C99标准中的inline有较大的不同。1.1.staticinlineGCC的staticinline定义很容易理解:你可以把它认

3、为是一个static的函数,加上了inline的属性。这个函数大部分表现和普通的static函数一样,只不过在调用这种函数的时候,gcc会在其调用处将其汇编码展开编译而不为这个函数生成独立的汇编码。除了以下几种情况外:函数的地址被使用的时候。如通过函数指针对函数进行了间接调用。这种情况下就不得不为staticinline函数生成独立的汇编码,否则它没有自己的地址。其他一些无法展开的情况,比如函数本身有递归调用自身的行为等。staticinline函数和static函数一样,其定义的范围是local的,即可以在程序内有

4、多个同名的定义(只要不位于同一个文件内即可)。注意:gcc的staticinline的表现行为和C99标准的staticinline是一致的。所以这种定义可以放心使用而没有兼容性问题。要点:gcc的staticinline相对于static函数来说只是在调用时建议编译器进行内联展开;gcc不会特意为staticinline函数生成独立的汇编码,除非出现了必须生成不可的情况(如通过函数指针调用和递归调用);gcc的staticinline函数仅能作用于文件范围内。1.2.inline相对于C99的inline来说,GC

5、C的inline更容易理解:可以认为它是一个普通全局函数加上了inline的属性。即在其定义所在文件内,它的表现和staticinline一致:在能展开的时候会被内联展开编译。但是为了能够在文件外调用它,gcc一定会为它生成一份独立的汇编码,以便在外部进行调用。即从文件外部看来,它和一个普通的extern的函数无异。举个例子:foo.c:/*这里定义了一个inline的函数foo()*/inlinefoo(){编译器会像非inline函数一样为foo()生成独立的汇编码}voidfunc1(){foo();同文件内f

6、oo()可能被编译器内联展开编译而不是直接call上面生成的汇编码}而在另一个文件里调用foo()的时候,则直接call的是上面文件内生成的汇编码:bar.c:externfoo();声明foo(),注意不能在声明内带inline关键字voidfunc2(){foo();这里就是直接call在foo.c内为foo()函数生成的汇编码了虽然gcc的inline函数的行为很好理解,但是它和C99的inline是有很大差别的。请注意看后面对C99inline的描述(第2.2节“inline”),以及如何以兼顾GCC和C99

7、的方式使用inline函数。要点:gcc的inline函数相对于普通extern函数来说只是在同一个文件内调用时建议编译器进行内联展开;gcc一定会为inline函数生成一份独立的汇编码,以便其在本文件之外被调用。在别的文件内看来,这个inline函数和普通的extern函数无异;gcc的inline函数是全局性的:在文件内可以作为一个内联函数被内联展开,而在文件外可以调用它。1.3.externinlineGCC的staticinline和inline都很好理解:看起来都像是对普通函数添加了可内联的属性。但是这个e

8、xterninline就千万不能想当然地理解成就是一个extern的函数+inline属性了。实际上gcc的externinline十分古怪:一个externinline的函数只会被内联进去,而绝对不会生成独立的汇编码!即使是通过指针应用或者是递归调用也不会让编译器为它生成汇编码,在这种时候对此函数的调用会被处理成一个外部引用。另外,exter

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。