c++的类中的c 中内联函数数是怎么回事

  摘 要:本文着重探究内联的优点与局限性,说明什么情况下应该采用、不该采用以及要警惕错用。   关键词:C语言;" />
免费阅读期刊
论文发表、论文指导
周一至周五
9:00&22:00
浅谈C++中内联函数的应用
2013年11期目录
&&&&&&本期共收录文章20篇
  摘 要:本文着重探究内联的优点与局限性,说明什么情况下应该采用、不该采用以及要警惕错用。 中国论文网 /8/view-5430197.htm  关键词:C语言;C++;内联函数   对比于C语言的函数,C++增加了重载、内联、const和virtual四种新机制。其中重载和内联机制既可用于全局函数也可用于类的成员函数,const与virtual机制仅用于类的成员函数。重载和内联肯定有其好处才会被C++语言采纳,但是不可以当成免费的午餐而滥用。   1 用内联取代宏代码   C++语言支持函数内联,其目的是为了提高函数的执行效率。在C程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来象函数。预处理器用复制宏代码的方式代替函数调用,省去了参数压栈、生成汇编语言的CALL调用、返回参数、执行return等过程,从而提高了速度。使用宏代码最大的缺点是容易出错,预处理器在复制宏代码时常常产生意想不到的边际效应。   例如“#define MAX(a,b) (a)>(b)?(a):(b)”语句“result=MAX(i,j)+2;”将被预处理器解释为“result=(i)>(j)?(i):(j)+2;”由于运算符‘+’比运算符‘:’的优先级高,所以上述语句并不等价于期望的“result=((i)>(j)? (i):(j))+2;”。如果把宏代码改写为“ #define MAX(a,b)((a)>(b)?(a):(b))”,则可以解决由优先级引起的错误。但是即使使用修改后的宏代码也不是万无一失的,例如语句“result=MAX(i++,j);”将被预处理器解释为“result=(i++)>(j)?(i++):(j);”。对于C++ 而言,使用宏代码还有另一种缺点,即无法操作类的私有数据成员。   让我们看看C++的“函数内联”是如何工作的。对于任何内联函数,编译器在符号表里放入函数的声明。如果编译器没有发现内联函数存在错误,那么该函数的代码也被放入符号表里。在调用一个内联函数时,编译器首先检查调用是否正确。如果正确,内联函数的代码就会直接替换函数调用,于是省去了函数调用的开销。这个过程与预处理有显著的不同,因为预处理器不能进行类型安全检查,或者进行自动类型转换。假如内联函数是成员函数,对象的地址会被放在合适的地方,这也是预处理器办不到的。   C++语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员。所以在C++程序中,应该用内联函数取代所有宏代码,“断言assert”恐怕是唯一的例外。assert是仅在Debug版本起作用的宏,它用于检查“不应该”发生的情况。为了不在程序的Debug版本和Release版本引起差别,assert不应该产生任何副作用。如果assert是函数,由于函数调用会引起内存、代码的变动,那么将导致Debug版本与Release版本存在差异。所以assert不是函数,而是宏。   2 内联函数的编程风格   关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。如下风格的函数Foo不能成为内联函数:   inline void Foo(int x, int y); // inline仅与函数声明放在一起   void Foo(int x, int y)   {   …   }   而如下风格的函数Foo则成为内联函数:void Foo(int x, int y);   inline void Foo(int x, int y) // inline与函数定义体放在一起   {   …   }   所以说,inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内联函数的声明、定义体前面都加了inline关键字,但我认为inline不应该出现在函数的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C程序设计风格的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需要内联。   定义在类声明之中的成员函数将自动地成为内联函数,例如   class A   {   public:   void Foo(int x, int y) { … } // 自动地成为内联函数   }   将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:   // 头文件   class A   {   public:   void Foo(int x, int y);   }   // 定义文件   inline void A::Foo(int x, int y)   {   …   }   3 慎用内联   内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?但如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?   内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。以下情况不宜使用内联:   ⑴如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。   ⑵如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。   类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联,这也进一步说明了inline不应该出现在函数的声明中。   C++语言中的内联展现了很多优点,但是这些优点的背后都隐藏着一些隐患。正如人们的饮食,少食和暴食都不可取,应当恰到好处。我们要辨证地看待C++的一些新机制,应该恰如其分地使用它们。虽然这会使我们编程时多费一些心思,少了一些痛快,但这才是编程的艺术。
转载请注明来源。原文地址:
【xzbu】郑重声明:本网站资源、信息来源于网络,完全免费共享,仅供学习和研究使用,版权和著作权归原作者所有,如有不愿意被转载的情况,请通知我们删除已转载的信息。
xzbu发布此信息目的在于传播更多信息,与本网站立场无关。xzbu不保证该信息(包括但不限于文字、数据及图表)准确性、真实性、完整性等。C++中内联函数inline的另一作用_Linux编程_Linux公社-Linux系统门户网站
你好,游客
C++中内联函数inline的另一作用
来源:Linux社区&
作者:tobacco
内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。今天在coding时遇到多次定义一个函数而使ld返回错误的情况。大致过程如下:
首先,在一个头文件中定义了一个类及其实现:
#ifndef&TEST_H &&
#define&TEST_H &&
class&A{&&
&&&&public:&&
&&&&void&fun();&&
void&A::fun(){&&
& & 然后分别有两个文件:
#include"test.h" &&
void&tt()&&
#include&iostream& &&
#include"test.h" &&
using&namespace&&&
void&tt();&&
int&main()&&
&&&&A&a;&&
&&&&tt();&&
&&&&return&0;&&
}&&&&& 而后,将a和b分别编译之后就会出错:
想了想,是由于分开后在a.o和b.o中都分别定义了A的fun()函数,因此会发生冲突。
相关资讯 & & &
& (02月28日)
& (12/20/:13)
& (04月28日)
& (12/20/:56)
& (12/07/:51)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
44 发表于 白扫二维码下载作业帮
1.75亿学生的选择
下载作业帮安装包
扫二维码下载作业帮
1.75亿学生的选择
c++内联函数和普通函数的区别不要只说 内联函数多个inline 或是内联提高效率我想知道内敛函数的函数体和普通的有啥不同我看了好几个例子都差不多
扫二维码下载作业帮
1.75亿学生的选择
没有区别,只是加一个inline关键字而已,如果说是区别,就是说它是包含在类里面的,虽然在外面定义,如果没有inline关键字,那就是在外部的函数,不属于这个类
为您推荐:
其他类似问题
扫描下载二维码7385人阅读
C/C++(19)
今天复习C++ Primer的时候,看到了关于C++类的内联成员函数的放置,应该放在头文件中。那么这到底是为什么
呢?仅仅是一种代码规范问题还是必须这样做呢?
下面我就来讲讲我自己的理解吧。要彻底理解这个问题,首先就要了解下函数的声明和定义了。我们知道,函数可以
在多处声明,但只能在一个地方定义,不然就会出现重定义。大部分函数默认是外部链接,而inline函数默认为内部链
接。也就是说inline函数只能在本文件中使用,对其他文件是不可见的。一般我们使用某个类的时候,都是在文件中加
上该类的头文件,以便我们可以使用该类的接口。而我们类的成员函数的实现都是放在相应的.cpp文件中的,而在.h
文件中声明。这样我们便可以通过.h文件中的成员函数的声明找到其定义,继而使用成员函数了。但如果将inline函数
放在.cpp文件中,那么其只对.cpp文件有效,这样我们就无法访问它了。所以我们将其放在类的声明的头文件中,这
样通过包含该头文件来使用它。
下面写个实际的例子来说明一下,我先把内联函数放到类声明的头文件中:
/*test.h*/
#ifndef TEST_H
#define TEST_H
#include &iostream&
using std::
using std::
class test
test():x(10){}
inline void print();
void display (int y);
void test::print()
cout && x &&
/*test.cpp*/
#include &iostream&
#include &test.h&
using std::
using std::
void test::display(int y)
cout && x * y &&
/*main.cpp*/
#include &iostream&
#include &test.h&
int main()
T.display(10);
T.print();
system(&pause&);
运行结果正常,下面来看看将内联函数放到.cpp中去:
/*test.h*/
#ifndef TEST_H
#define TEST_H
#include &iostream&
using std::
using std::
class test
test():x(10){}
inline void print();
void display (int y);
/*test.cpp*/
#include &iostream&
#include &test.h&
using std::
using std::
void test::print()
cout && x &&
void test::display(int y)
cout && x * y &&
测试函数和上面的main.cpp是一样的。这是出现了错误:
error LNK2019: 无法解析的外部符号 &public: void __thiscall&test::print(void)& (?print@test@@QAEXXZ),该符号在函
数 _main 中被引用。如果我将测试函数改为:
int main()
T.display(10);
//T.print();
system(&pause&);
那么运行结果正常。从此可以得出结论:内联函数放在头文件或者.cpp中都是没有错的,但如果我们需要在程序中访
问它,那么就必须将其放在头文件中。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:266056次
积分:3252
积分:3252
排名:第9315名
原创:63篇
转载:20篇
评论:74条
文章:14篇
阅读:37961
(1)(4)(7)(2)(5)(9)(8)(25)(8)(5)(2)(1)(6)c++中什么是内联函数的分析
  引入内联函数的目的是为了解决顺序中函数调用的效率成绩。
  C++函数是一种更高级的笼统。 它的引入使得编程者只关心函数的功能和运用方法,
而不用关心函数功能的详细实现;函数的引入可以增加顺序的目的代码, 实现顺序代码和数据的共享。 但是, 函数调用也会带来降低效率的成绩,
因为调用函数实践上将顺序执行顺序转移到函数所存放在内存中某个地址, 将函数的顺序内容执行完后, 再前往到转去执行该函数前的地方。
这种转移操作要求在转去前要保护现场并记忆执行的地址, 转回后先要恢复现场?丛幢9艿刂烦中葱小?因而,
函数调用要有一定的工夫和空间方面的开支, 于是将影响其效率。 特别是关于一些函数体代码不是很大, 但又频繁地被调用的函数来讲,
解决其效率成绩更为重要。 引入内联函数实践上就是为了解决这一成绩。
  在顺序编译时, 编译器将顺序中呈现的内联函数的调用表达式用内联函数的函数体来进行交换。 显然, 这种做法不会产生转去转回的成绩,
但是由于在编译时将函数休中的代码被替代到顺序中, 因而会增加目的顺序代码量, 进而增加空间开支, 而在工夫代销上不象函数调用时那么大,
可见它是以目的代码的增加为代价来换取工夫的节省。
  内联函数的定义方法
  定义内联函数的方法很简单, 只要在函数定义的头前加上关键字inline即可。 内联函数的定义方法与一般函数一样。 如:
  在顺序中, 调用其函数时, 该函数在编译时被替代, 而不是像一般函数那样是在运行时被调用。
  运用内联函数应留意的事项
  内联函数具有一般函数的特性, 它与一般函数所不同之处公在于函数调用的处置。 一般函数进行调用时, 要将顺序执行权转到被调用函数中,
然后再前往到调用它的函数中;而内联函数在调用时, 是将调用表达式用内联函数体来交换。 在运用内联函数时, 应留意如下几点:
  1. 类内定义的函数是内联函数, 类外定义的函数是非内联函数(短函数可以定义在类内, 长函数可以定义在类外)。
  2. 可以为类外定义的函数指定inline关键字, 强行为内联函数。
  3. 在内联函数内不允许用循环语句和开关语句。
  4. 内联函数的定义必需出如今内联函数第一次被调用之前。 暂无留言!您能够会对以下信息感兴趣:
文章由整理,收集辛苦,希望能保留出处。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 c语言有内联函数吗 的文章

 

随机推荐