社区
C++ 语言
帖子详情
大家可以谈一下inline的优缺点吗
hengjiweiye777
2007-07-19 12:05:37
如题
谢谢
...全文
595
9
打赏
收藏
大家可以谈一下inline的优缺点吗
如题 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
优点:不要入出栈保护现场等函数调用的耗费,效率稍微好点,尤其对于小函数
缺点:暴露自己的实现给用户~
浅
谈
内联函数与宏定义的区别详解
用内联取代宏:1.内联函数在运行时可调试,而宏定义不可以;2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; 3.内联函数可以访问类的成员变量,宏定义则不能; 4.在类中声明同时定义的成员函数,自动转化为内联函数。文章(一)内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如: #define MAX(a,b) ((a)>(b)?(a):(b)) 该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。 宏定义语句的书写格式有过分的讲究, MAX与括号之间
Linux多线程服务端编程:使用muduo C++网络库
《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). . . . . . . . . .
拉格朗日插值的
优缺点
_浅
谈
拉格朗日插值
浅
谈
拉格朗日插值在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式。——百度百科通俗地说,拉格朗日插值法可以找出一个恰好经过直角坐标系内\(n\)个给定点的函数众所...
inline
与C语言中的宏
转自;百度百科
inline
关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。但是为什么要这么替换,以下详细说明: 1.C语言中的宏有哪些
优缺点
优点:首先
谈
一下
在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作。因
Solidity vs. Vyper:不同的智能合约语言的
优缺点
本文探讨以下问题:哪种智能合约语言更有优势,Solidity、Vyper、Huff 和 Yul ?最近,关于哪种是“最好的”智能合约语言存在很多争论,当然了,每一种语言都有适用的场景。这篇文章是为了最根本的问题:我应该使用哪一种智能合约语言?
C++ 语言
64,648
社区成员
250,503
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章