| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1479 人关注过本帖
标题:[讨论]FAQ新增条目建议 内联函数有关知识
只看楼主 加入收藏
多维数组
Rank: 1
等 级:新手上路
帖 子:238
专家分:0
注 册:2006-8-16
收藏
得分:0 
原来是内联函数(老朋友)。
确实是个好东西

有事发邮件:tzp_1210@
2007-09-21 21:02
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 
我把题目给改了,不叫faq就好了呵呵

You have lots more to work on! Never give up!c language!
2007-09-21 21:03
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
我把题目给改了,不叫faq就好了呵呵


小样,再灌水偶删你贴
2007-09-21 21:05
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 

[9.1] 内联函数是干嘛的?
内联函数是将被插入到调用者代码流中的函数,就像一个#define的宏一样,内联函数通过避免调用自己和(特别是)通过编译在调用过程中优化调用过程(过程整合)来达到提升性能的效果.

[9.2] 内联函数是如果保证安全和速度的平衡性的?
在C中,你可以通过在结构体里面放置一个void*来达到"封装的结构体",这种情况下,void*指向结构体中用户不知道的实际数据。这样结构体的用户就不知道如何解释用void*指向的内容,但是访问这些函数的时候就会从void*型自动转换为相应的合适的类型。这就给出了一种形式的封装。

不幸的是它失去了类型的安全性,它也在强制函数调用的时候要访问结构体中每个角落的数据(如果你允许对结构体进行直接的访问的话,任何人都可以访问它们,因为他们有必要知道他们如何解析用void*指向的东西,这个会让改变数据结构的时候变得更加困难了.

[9.3] 我为什么要用内联函数呢?而不是用原来好好的#define宏?

因为#define宏在四个方面是非常糟糕的(这里的内容没有找到,比较遗憾)

不像#define宏,内联函数可以避免声名狼籍的宏错误因为内联函数总是对每个参数精确匹配一次。换言之,调用内联函数在语义上只是像调用了一个正则表达式,只是要更快一些:

//一个返回i绝对值的宏
#define unsafe(i) ( (i) >=0 ? (i) : -(i) )

//一个返回i的绝对值的内联函数
inline int safe(int i)
{
return i>=0?i:-i;
}

int f();

void userCode(int x)
{
int ans;

ans=unsafe(x++);
ans=unsafe(f());

ans=safe(x++);
ans=safe(f());
}


与宏不一样的是,参数的类型是会被检查的,不必要的会话会被正确的处理。

宏对你的程序的健康是不利的,除非不得以,否则不要用它们!

[9.4] 你怎么让编译器识别一个非成员函数的内联函数?
当你申明一个内联函数的时候,它看起来就像是一个普通的函数:
void f(int i,char c)
但是当你定义一个内联的函数,你把函数的定义加上inline关键字,当你所以下的定义放入头文件之后:

inline
void f(int i,char c)
{
//...
}
注意:把一个函数的定义放到一个头文件里面是一个规则性的东西。除非函数只是在一个单独的c文件中调用到了。特别的,如果你把内联函数放在一个c文件里面,而你从其他的c文件里面调用它,你会在连接器得到一个"unresolved external"错误。

[9.5] 内联函数会一定让你的程序性能更好吗?
不是的。

注意内联函数的过度应用会造成代码的膨肿,这个会让分页平台环境的性能降低。


小改了下,不过就不知道某些地方有没有错误了。。。原9。5和9。6全是关于C++的,所以删了


偶学编程,也许本身就是一个错。。。
2007-09-21 21:09
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
以下是我的理解:
inline(内联)的实质还是封装,把若干有用的,重复出现的语句封装起来。正因为这些语句重复出现,所以我们为不必要的重复劳动所以我们用函数封装,但为什么我们不用函数呢?《C++ Primer》是这样讲的:

将shorterString(引者注:编者举的一个例子,一个用C++写的函数)写成函数有一个潜在的缺点:调用函数比求解等价表达式要慢得多。在大多数的机器上,调用函数都要做很多工作:调用前要先保存寄存器,并在返回时恢复;复制实参;程序还必须转向一个新位置执行。

讲函数指定为内联函数,(通常)就是将它在程序中每个调用点上“内联地”展开。(例子就不举了,因为是C++怕新手看不懂

一般来说,内联机制适用于优化小的、只有几行的而且经常被调用的函数。大多数的编译器都不支持递归函数的内联。一个1200行的函数也不太可能在调用点内联展开。

[此贴子已经被作者于2007-9-21 21:12:07编辑过]


我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2007-09-21 21:10
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
楼主,14楼的就是你的定稿吗

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2007-09-21 22:10
栖柏
Rank: 2
等 级:论坛游民
威 望:3
帖 子:1103
专家分:17
注 册:2007-8-23
收藏
得分:0 
我不参与,删别人的不如写自己的,尊重别人呀

You have lots more to work on! Never give up!c language!
2007-09-21 22:13
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
收藏
得分:0 
回复:(栖柏)[讨论]FAQ新增条目建议 内联函数有关知...
话说,这篇帖子的内容实在是太深了一点……以老谭的书的目录为例:
01C语言概述
02程序的灵魂—算法
03数据类型、运算符与表达式
04顺序程序设计
05分支结构程序
06循环控制
07数组
08函数
09预处理命令
10指针
11结构体与共用体
12位运算
13文件

这个……内联函数的位置在那里?

我觉得,对于初学者,他所要考虑的就是“如何能写出正确的代码”而还没到考虑"如何写出执行起来更有效率的代码“的地步,楼主的帖子可以当成是一种高级应用发出来,作为初学者faq实在是有点太深了。

2007-09-22 18:39
sunyuantz
Rank: 1
等 级:新手上路
威 望:1
帖 子:407
专家分:0
注 册:2006-3-20
收藏
得分:0 
纯属讨论,不过内联确实很深!
ps:个人意见,18楼请不要以老谭的书为列子,世界上比老谭好的是多的是

我不是名人,所以不要签名。等哪天我成名人了......你都认识我了还要签名干嘛!
2007-09-22 18:43
lg_mic
Rank: 1
等 级:新手上路
帖 子:55
专家分:0
注 册:2007-9-18
收藏
得分:0 
我没看过老谭的书,不过手上的电子版的书就这一本……况且我只是举目录说明一下而已……

2007-09-22 18:52
快速回复:[讨论]FAQ新增条目建议 内联函数有关知识
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046664 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved