免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3138 | 回复: 7
打印 上一主题 下一主题

请问内核中的static inline [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-22 11:30 |只看该作者 |倒序浏览
内核中的内联函数我们常常会看到这样的定义:

static inline void dog(unsigned long tail_size)

LKD上说“由于使用了 static做为关键字进行限制,所以编译时不会为内联函数单独建立一个函数体”

不建立函数体是不是应该是因为有inline?static在这里的作用是什么阿?

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
2 [报告]
发表于 2009-11-22 13:31 |只看该作者
http://old.blog.edu.cn/user1/6206/archives/2007/1725667.shtml

static 表示这个函数使用内部连接,即编译单元以外看不到名字_syscall
inline 建议编译器采用内联的方式处理该函数调用。

Linus是这样解释的:
"static inline" means "we have to have this function, if you use it  but don't inline it, then make a static version of it in this  compilation unit"
"extern inline" means "I actually _have_ an extern for this function, but if you want to inline it, here's the inline-version".

论坛徽章:
0
3 [报告]
发表于 2009-11-22 14:28 |只看该作者

回复 #1 hongmy525 的帖子

LKD上说“由于使用了 static做为关键字进行限制,所以编译时不会为内联函数单独建立一个函数体”

这个说法确实有问题,应该是inline的作用

至于为什么static,大多数情况下inline函数应该声明为static的
参见gcc的manual
http://gcc.gnu.org/onlinedocs/gcc/Inline.html
这是因为如果没有static限制,gcc会假定有其他文件中使用到这个函数,那些调用这个inline函数的代码就没法inline了
所以
Therefore, a non-static inline function is always compiled on its own in the usual fashion.

意即non-static的inline函数是没法真正inline的

但是,最后对extern inline的解释中,文档似乎又有与此矛盾的地方...
俺就不乱说了,有兴趣请看文档

论坛徽章:
0
4 [报告]
发表于 2009-11-23 13:23 |只看该作者

回复 #3 lemoncookie 的帖子

谢谢,比原来明白些了,呵呵

刚才网上搜了一下,不知道功力不够还是什么,看得也不完全明白~

也谢谢openspace

那个LKD上的引用,我对照了一下英文版的,发现应该算是中文版的一个翻译失误。英文原文是:
Because they are marked static ,an exported function is not created.

[ 本帖最后由 hongmy525 于 2009-11-23 13:24 编辑 ]

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2009-11-23 13:52 |只看该作者

回复 #4 hongmy525 的帖子

LZ以后看资料的是否可以中英文版的结合着看
先看中文版的,有疑问就看看对应的英文的
以前看书的时候也遇到过这种问题,总是觉得一句话讲的很含糊,看对应英文版的很快就过去了

PS:这种现象比较正常,大把英文资料,翻着翻着就乏了

论坛徽章:
0
6 [报告]
发表于 2009-11-23 22:30 |只看该作者
static inline void dog(unsigned long tail_size)
我个人觉得 static inline 函数都是定义在头文件里面的.
如果 没有static 的话 编译会报重定义的错误的.

论坛徽章:
0
7 [报告]
发表于 2010-05-26 16:18 |只看该作者
谢谢大家,当时补了一下基础,看了一下static的作用明白了,忘记结贴,不好意思

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
8 [报告]
发表于 2010-05-26 16:22 |只看该作者
谢谢大家,当时补了一下基础,看了一下static的作用明白了,忘记结贴,不好意思
hongmy525 发表于 2010-05-26 16:18


记得结贴是一个好习惯:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP