大家可以谈一下inline的优缺点吗

hengjiweiye777 2007-07-19 12:05:37
如题
谢谢
...全文
630 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihorse_1043 2008-09-04
  • 打赏
  • 举报
回复
呵呵,管他呢,小弟倒是学了点东西,呵呵,谢谢搂主了。
juicee 2007-07-19
  • 打赏
  • 举报
回复
- -kan chu lai le ....
iambic 2007-07-19
  • 打赏
  • 举报
回复
你给自己倒分?
奶糖人五号 2007-07-19
  • 打赏
  • 举报
回复
简单的来说:

inline的功效类似宏替换,这样就省略了函数调用的过程,而直接执行了函数体里的代码,并且还可能根据需要优化掉一些冗余的变量

但是负面影响是:造成代码体积的增大。这对于程序自身来说没有什么,但是CPU的cache,虚拟内存的分页等缓存,它们的大小都是有限的,如果程序很小能直接装在cache或是一个分页里,显然就不用再读取更多的内容,而程序体积过大会导致程序部分代码不在缓存里(因为装不下),那么就要读取新的分页,或更换cache里的内容,这种开销是很大的

一般来说,保证程序的主流程被优化就可以了,分支流程由于执行的机会少,过多的inline还会导致上面说到的代码体积膨胀的问题,得不偿失
我啃 2007-07-19
  • 打赏
  • 举报
回复
缺点 inline还是会拷贝代码增加代码量 (不知道对不对)
如果这个函数真是很小的话,可能消除的保护现场的代码量还比函数体多
这个说不准,一个人总不会要一个1000行的函数也内联吧~
liujiwei2007 2007-07-19
  • 打赏
  • 举报
回复
inline 这个关键字,是后来加入到 C++ 的标准的。我认为这个可能 C++
的编译器设计者,当初沿用了 C 中宏定义造成的。但是由于宏定义带来的麻烦,因此在 C++ 中产生了 inline。一场技术革命,通常会影响许多技术细节的革新。

大家都知道函数调用,是需要一定的开销的。这个开销是由于转去执行另一个代码段,而执行完了还要返回原来的代码段所产生的。因此,我们把要转去执行的代码段,安插进现在执行的代码段。这样就省去了函数调用,也就省去了调用的开销。这样的安插,并不是将要调用的函数的代码,全部的安插进去,而是进行相应的替换。

但是,这个内联只是一个建议,最后采纳与否还得编译器说的算。如果,你的函数可以进行内联,而没有声明内联的时候,那么编译器可能将其内联。哈哈!多么聪明的编译器啊!

上面这些大家都应该很清楚的,因为很多学校的课本上,都有所说明。那么,既然编译器可以为我们做这么多的事情,我们为什么还要如此的研究技术细节呢?那是因为,了解细节可以让我们对技术了解的更加透彻。

下面这些,是一些书很少提到的。VC 下面,有两个调试版本。一个是 Debug,另一个是 Release 。前者是用于调试的,不进行任何优化;后者是用于发布的,程序的优化。往往在同一个程序里,前者生成的程序要大于后者生成的程序。因此,你应该清楚,在 Debug 下,内联性是体现不出来的。想要看到内联性,需要在 Release 下。你可以通过汇编代码来看,因为省去函数调用的开销。

也许有的人会问了,既然内联函数这么好,那么我把所有的函数都声明为内联怎么样?这个问题,我在 CSDN 上见过。我的看法是这样的,如果你把所有的函数都声明为 inline ,但是并不一定其可能成为内联。但是,如果内联展开的函数过多,势必会造成代码的臃肿。这样有可能导致内存的频繁换页,你要知道它的开销要比函数调用的开销要大的多。因为,这个是内存和外存的存取速度的区别。所以说,这样反而降低了程序的效率。就像我们做事的时候,要达到一种平衡,这样才是最好的境界。

一点迂见,如有错误,请指教!油箱 liujiwei777@163.com
taodm 2007-07-19
  • 打赏
  • 举报
回复
去看《Execptional C++》/《More Execptional C++》/《Execptional C++ Style》里关于inline的条款即可。已经足够详尽了,没必要由我们自己来总结了。
goodluckyxl 2007-07-19
  • 打赏
  • 举报
回复
优点 还有会比宏多了参数检测增加了一些安全性
缺点 inline还是会拷贝代码增加代码量 (不知道对不对)
我啃 2007-07-19
  • 打赏
  • 举报
回复
优点:不要入出栈保护现场等函数调用的耗费,效率稍微好点,尤其对于小函数
缺点:暴露自己的实现给用户~

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧