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

hengjiweiye777 2007-07-19 12:05:37
如题
谢谢
...全文
595 9 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
优点:不要入出栈保护现场等函数调用的耗费,效率稍微好点,尤其对于小函数
缺点:暴露自己的实现给用户~
《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。 目 录 第1部分C++ 多线程系统编程 第1章线程安全的对象生命期管理3 1.1当析构函数遇到多线程. . . . . . . . . . . . . . . . .. . . . . . . . . . . 3 1.1.1线程安全的定义. . . . . . . . . . . . . . . . .. . . . . . . . . . . 4 1.1.2MutexLock 与MutexLockGuard. . . . . . . . . . . . . . . . . . . . 4 1.1.3一个线程安全的Counter 示例.. . . . . . . . . . . . . . . . . . . 4 1.2对象的创建很简单. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 5 1.3销毁太难. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 7 1.3.1mutex 不是办法. . . . . . . . . . . . . . . . . . . .. . . . . . . . 7 1.3.2作为数据成员的mutex 不能保护析构.. . . . . . . . . . . . . . 8 1.4线程安全的Observer 有多难.. . . . . . . . . . . . . . . . . . . . . . . . 8 1.5原始指针有何不妥. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 11 1.6神器shared_ptr/weak_ptr . . . . . . . . . .. . . . . . . . . . . . . . . . 13 1.7插曲:系统地避免各种指针错误. . . . . . . . . . . . . . . . .. . . . . . 14 1.8应用到Observer 上.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.9再论shared_ptr 的线程安全.. . . . . . . . . . . . . . . . . . . . . . . . 17 1.10shared_ptr 技术与陷阱. . . .. . . . . . . . . . . . . . . . . . . . . . . . 19 1.11对象池. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 21 1.11.1enable_shared_from_this . . . . . . . . . . . . . . . . . . . . . . 23 1.11.2弱回调. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 24 1.12替代方案. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 26 1.13心得与小结. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 26 1.14Observer 之谬. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 第2章线程同步精要 2.1互斥器(mutex). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 2.1.1只使用非递归的mutex . . . . . . . . . . . . . .. . . . . . . . . . 33 2.1.2死锁. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 35 2.2条件变量(condition variable). . . . . . . . . .

64,648

社区成员

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

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