Chinaunix首页 | 论坛 | 博客
  • 博客访问: 768166
  • 博文数量: 199
  • 博客积分: 3584
  • 博客等级: 中校
  • 技术积分: 2193
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 21:18
文章分类

全部博文(199)

文章存档

2018年(6)

2013年(14)

2012年(30)

2011年(28)

2010年(24)

2009年(86)

2008年(11)

分类: C/C++

2009-09-11 14:06:48

(一)inline函数(摘自C++ Primer的第三版)

   在函数声明或定中函数返回型前加上关键inline即把min()指定

   inline int min(int first, int secend) {/****/};

   inline函数对编译器而言必是可的,以便它能用点内展开该函数。与非inline

  函数不同的是,inline函数必函数的个文本文件中定。当然,于同一程序

  的不同文件,如果inline函数出,其定相同。于由两个文件compute.Cdraw.C构成的程序来,程序不能定义这样min()函数,它在compute.C中指一件事情,

  而在draw.C中指另外一件事情。如果两个定不相同,程序将会有未定的行

   不会这样的事情,建inline函数的定放到文件中。在inline函数的

  文件中包含该头文件。这种方法保证对每inline函数只有一个定,且程序无需制代,并且

  不可能在程序的生命期中引起无意的不匹配的事情。

  (二)内函数的(摘自高C++/C 程指南)

  关键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)

  {

  }

  慎用内

  内能提高函数的行效率,不把所有的函数都定成内函数?

  如果所有的函数都是内函数,用得着“内关键

  内是以代制)代价,仅仅省去了函数用的开销,从而提高函数的行效率。如果行函数体内代时间,相比于函数用的开销较大,那效率的收会很少。另一方面,函数的用都要制代,将使程序的量增大,消耗更多的内存空以下情况不宜使用内

  (1)如果函数体内的代较长,使用内致内存消耗代价高。

  (2)如果函数体内出,那么执行函数体内代时间要比函数用的开销大。

  的构造函数和析构函数容易解成使用内更有效。要当心构造函数和析构函数可能会藏一些行,如“偷偷地”行了基或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定体放在声明中。

  一个好的编译器将会根据函数的定体,自地取消不得的内这进步说inline 应该在函数的声明中)。

 

inline函数的一些总结

看下面的函数,函数体中只有一行句:

    double Average(double total, int number){

      return total/number;

      }

义这么简单的函数有必要实际上,它是有一些点的:第一,它使程序更可;第二,它使段代可以重使用。但是,它也有缺点:当它被繁地用的候,由于用函数的开销,会对应用程序的性能(时间+空效率,儿特指时间)失。例如,Average在一个循环语句中重复调用几千次,会降低程 序的行效率。

 

    ,有法避免函数用的开销吗于上面的函数,我可以把它定义为函数的形式:

    inline double Average(double total, int number){

      return total/number;

    }

函数的引入可以减少程序的目实现程序代的共享。

   函数用需要时间和空间开销用函数实际上将程序行流程移到被函数中,被函数的代码执行完后,再返回到用的地方。这种调用操作要求用前保 现场记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。较长的函数这种开销可以忽略不,但于一些函数体代很短,又被 的函数,就不能忽视这种开销。引入内函数正是了解决问题,提高程序的运行效率。

    在程序编译时编译器将程序中出的内函数的 用表达式用内函数的函数体来行替。由于在编译时将内函数体中的代替代到程序中,因此会增加目程序代量,而增加空间开销,而在时间开销上不 象函数大,可它是以目的增加代价来时间省。

 

总结inline函数是提高运行时间效率,但却增加了空间开销

       inline函数目的是:了提高函数的行效率(速度)

非内函数用有内存建和放的开销

C中可以用宏代提高行效率,宏代不是函数但使用起来像函数,编译器用制宏代的方式取代函数用,省去了参数压栈、生成汇编语言的CALL用、返回参数、return程,从而提高速度。

 

◆使用宏的缺点:(1)容易出(预处理器在制宏代码时常常生意想不到的边际)

                  例如:#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;

              2)不可调试

              3)无法操作的私有数据成

 

        C++函数内机制既具宏代的效率,又增加了安全性,且可自由操作的数据成

        关键inline与函数定体放在一起才能使函数真正内inline放在函数声明的前面不起任何作用。因inlin是一用于实现关键字,不是一用于声明的关键字。

        籍把内函数的声明、定体前都加了inline关键字,但声明前不应该(加不加不会影响函数功能),因声明与定不可混

 

★声明、定

声明:就是在向系名字(一个名字是一内存名),只是告诉编译个名字型及宣告名字的存在性,此而已。

是分配存,即具有了存储类型。

句:程序的基本成部分,分可()和不可(声明是)

在正式写程序句前定的一些全局量或局部量,在C声明,C++

例如:int  a;//C声明,是不可句;在C++,是可

      extern int a;//声明,是不可   CWinApp  curApp;//象定是可

 

◆使用内函数时应注意以下几个问题

1 在一个文件中定的内函数不能在另一个文件中使用。它通常放在文件中共享。

2 函数应该简洁,只有几个句,如果多,不适合于定义为函数。

3 函数体中,不能有循环语句、if句或switch句,否,函数定义时即使有inline关键字,编译器也会把函数作非内函数理。

4 函数要在函数被用之前声明。

例如:

#include

int increment(int i);

inline int increment(int i){

  i++; return i;

}

void main(void){  ……

}

如果我修改一下程序,将内函数的定移到main()之后:

    #include

int increment(int i);

void main(void){  ……

}

//函数定放在main()函数之后

inline int increment(int i){

  i++; return i;

}

函数在用之后才定段程序在编译编译器不会直接把它替main中。也就是说实际"increment(int i)"只是作一个普通函数被用,并不具有内函数的性,无法提高运行效率

 

 

 

 inline 函数

从某角度上inline程序影响几乎可以当成是一种编译选项(事上它也可以由编译选项实现)。

13.4.1 inline函数?

inline(小心,不是online),翻内嵌。意指:当编译发现某段代用一个内函数,它不是去函数,而是将函数的代,整段插入到当前位置。

这样做的好是省去了用的程,加快程序运行速度。(函数的程,由于有前面所的参数入等操作,所以要多占用一些时间)。

这样做的不好:由于当代码调用到内函数,就需要在直接插入一段函数的代,所以程序的体将增大。

拿生活象比,就像电视坏了,通过电话找修理工来,你会嫌慢,于是干脆在家里了一个修理工。这样当然是快了,不,修理工住在你家可就要占地儿了。

(某勤好学之大款看到段教程,沉思片刻,转头对床上的二奶

于明白你和街上的区

你是内型。”)

 

函数并不是必的,它只是了提高速度而行的一。要修一个函数型,使用如下格式:

 

inline 函数的声明或定

 

简单一句,在函数声明或定前加一个 inline 符。

 

inline int max(int a, int b)

{

   return (a>b)? a : b;

}

 

13.4.2 inline函数的规则

规则一、一个函数可以自已用自已,称为递归调用(后面到),含有递归调用的函数不能inline

规则二、使用了复杂流程控制句:循环语句和switch句,无法inline

规则三、由于inline增加体的特性,所以建inline函数内的代码应很短小。最好不超5行。

规则四、inline,特定的情况下,编译器将不理会inline关键字,而函数成普通函数。出现这种情况,编译器会出警告消息。

规则五、在你用一个内函数之前,个函数一定要在之前有声明或已定义为inline,如果在前面声明普通函数,而在用代后面才定义为一个inline函数,程序可以通过编译,但函数没有实现inline

比如下面代片段:

 

//函数一始没有被声明inline:

void foo();

 

//然后就有代码调用它:

foo();

 

//用后才有定函数inline:

inline void foo()

{

   ......

}

 

是的foo()函数最没有实现inline;

 

规则六、调试方便,在程序调试阶,所有内函数都不被实现

 

最后是笔者的一点:如果你真的发觉你的程序跑得很慢了,99.9%的原因在于你不合理甚至是错误设计,而和你用不用inline所以,其inline根本不是本章的重点。

 

 

 

C++中如何inline函数(MSVC, GCC)

Wentao Sun

看下面的代:

#ifdef _MSC_VER_ // for MSVC
#define forceinline __forceinline
#elif defined __GNUC__ // for gcc on Linux/Apple OS X
#define forceinline __inline__ __attribute__((always_inline))
#else
#define forceinline
#endif

这样可以使一些看起来比大的函数也能.

 

阅读(1934) | 评论(0) | 转发(0) |
0

上一篇:显示ip

下一篇:hp驱动安装顺序

给主人留下些什么吧!~~