关于C++中的inline函数

inline本身还是有另外一个意义:

一个可执行文件的cpp文件中一个函数只能被定义一次。如果你把函数定义在一个.h文件中并让两个cpp包含就会造成这个函数分别在两个cpp中被定义产生错误。但是inline函数是允许在多个cpp中多次定义的,就解决了这个问题。

//这段话什么意思,不太懂啊.函数不是可以重载吗?为什么不可以重新定义?

  内联函数:
  在C++中,为了避免主函数过于复杂,编程时会设置大量的子函数,而这样做降低了主函数的复杂性的同时却使得整个程序的执行效率降低,因为在进行函数调用时,系统需要时间及内存空间来保存现场信息,为了解决这个问题,C++中设了内联函数的概念(inline函数)。
  在函数编写过程中,内联函数的编写完全遵循子函数的编写规则,这样就使得代码同样都是比较简便的,然而不同之处出现在代码编译过程中,代码编译时会用内联函数主体替换函数调用部分,从而使得编译完成的程序是顺序执行下去的而不必再进行函数调用。

  我们看下面的函数,函数体中只有一行语句:
  double Average(double total, int number)
  {
   return total/number;
  }
  定义这么简单的函数有必要吗?实际上,它还是有一些优点的:第一,它使程序更可读;第二,它使这段代码可以重复使用。但是,它也有缺点:当它被频繁地调用的时候,由于调用函数的开销,会对应用程序的性能有损失。例如,Average在一个循环语句中重复调用几千次,会降低程序的执行效率。
  那么,有办法避免函数调用的开销吗?对于上面的函数,我么可以把它定义为内联函数的形式:
  inline double Average(double total, int number)
  {
   return total/number;
  }
   
  函数的引入可以减少程序的目标代码,实现程序代码的共享。但是,函数调用也需要一些时间和空间方面的开销,因为调用函数实际上将程序执行流程转移到被调函数中,被调函数的程序代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但是对于一些函数体代码很短,但又被频繁地调用的函数,就不能忽视这种开销。引入内联函数正是为了解决这个问题,提高程序的运行效率。
  在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替换。由于在编译时将函数体中的代码替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间开销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
使用内联函数时应注意以下几个问题:
  (1) 在一个文件中定义的内联函数不能在另一个文件中使用。它们通常放在头文件中共享。
  (2) 内联函数应该简洁,只有几个语句,如果语句较多,不适合于定义为内联函数。
  (3) 内联函数体中,不能有循环语句、if语句或switch语句,否则,函数定义时即使有inline关键字,编译器也会把该函数作为非内联函数处理。
  (4) 内联函数要在函数被调用之前声明。例如下面的代码将内联函数放在函数调用之后声明,不能起到预期的效果。
  
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-03
一个函数如果被重复定义的话,编译器将会不知道该调用哪个函数版本。函数重载跟重新定义是不一样的,函数重载要求参数列表不一样,即函数的参数要么个数不同,要么类型不同,这样的话编译器就知道该调用哪个版本的函数定义了。而inline函数就建议编译器原地展开编译(对于一般的函数应该是编译成独立的模块,执行的时候再跳转到该模块中运行,inline可以看做不用函数,而是把代码直接拼接在一起),这样就不造成定义混淆了。举个简单的例子,全国很多中山路,你说“中山路”大家不知道你指哪里,但是你在某个地区,说“这里的中山路”,大家就明白了。
另外在同一个cpp文件中,inline函数也应该只有一个定义,你所说的多次定义,只是不同的cpp文件可以定义不同。否则就应该用重载,加入无用的占位参数以区分参数列表。就像一个小地区里只有一条中山路一样,如果有两条以上,就会加入东南西北之类的限定词了。
第2个回答  推荐于2016-11-06
在这里,函数的重复定义与函数的重载是两回事。
函数的重载指的是两个或多个函数的函数名相同,但形参的类型或数量互不相同的情况下,编译器会把她们当作不同的函数来处理并根据调用时实参的情况决定调用哪个个函数的情况。而这里,由于.h头文件有可能会被多个.cpp文件包含,如果不采用一些办法(如使用编译预处理代码)让一个头文件在整个编译过程中只被包含一次,那你就会在编译时遇到类似“函数重复定义”的错误。这里你所说的inline关键字的一个作用就是可以避免这种问题。本回答被提问者采纳
相似回答