Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1259630
  • 博文数量: 264
  • 博客积分: 10772
  • 博客等级: 上将
  • 技术积分: 2325
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-25 11:54
文章分类

全部博文(264)

文章存档

2012年(4)

2011年(51)

2010年(31)

2009年(57)

2008年(51)

2007年(70)

分类: C/C++

2007-12-20 00:27:52

C++ 宏与内联函数

2005-8-16 22:56:42

内联函数是什么?
内联函数是代码被插入到调用者代码串处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。

宏与内联函数的区别
和 #define 宏不同的是,内联函数总是对参数只精确地进行一次求值,从而避免了宏错误。换句话说,调用内联函数和调用正规函数是等价的,差别仅仅是更快宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数.
C++编译器将内联函数的函数体扩展在函数调用的位置,使内联函数看起来象函数,却不需要承受函数调用的开销,对于一些函数体比较简单的内联函数来说,可以大大提高内联函数的调用效率。但内联函数并非没有代价,如果内联函数体比较大,内联函数的扩展将大大增加目标文件和可运行文件的大小;另外,inline关键字对编译器只是一种提示,并非一个强制指令,也就是说,编译器可能会忽略某些inline关键字,如果被忽略,内联函数将被当作普通的函数调用,编译器一般会忽略一些复杂的内联函数,如函数体中有复杂语句,包括循环语句、递归调用等。所以,内联函数的函数体定义要简单,否则在效率上会得不偿失。

 

 一个内联函数的例子:

#i nclude
#i nclude
using namespace std;// No.1

inline string dbtest(int a); //定义内联函数

void main()
{
       for (int i=1;i<=10;i++)
               {
                cout << i << ":" << dbtest(i) << endl;
               }
       cin.get();

}

string dbtest(int a)
{
       return (a%2>0)?"y":"n";
}


No.1:
std是c++的标准命名空间,所有标准类库都包含在其中,头文件
的标识符在其中定义。using namespace std就是告诉编译器使用
标准命名空间std,程序中的所有标准类库都在std中找。
   
 namespace 就是一个名字的空间。是为了避免名字冲突而使用的。
在不同的空间里可以使用同一个名字而不会引起名字冲突。
它的声明就像声明一个类一样。
例:
namespace A{
  int f(){……};
  char g(){……};
  ……}
在使用名字空间里函数的时候有几种方法:
1-就像声明一个类的成员函数一样,只是类名换成了空间名 A::f();
2-可以用using关键字 using namespace A; 这样以后的代码使用的
就是名字空间A中的函数了。

C++为了防止命名冲突而引进了namespace的概念,
它也将自己的标准库全部放入了std这个namespace中,
在使用标准库时,如果加上using namespace std;这
句,在以后的使用库中类、函数时就可以省略本来应该
写的std::???。

------------------------------------------------------
前几天面试问到一个问题,宏和inline函数有什么区别,当时没仔细想,过后总结了一些,请各位指教:  
  先说共同点:就是都不会引起函数的调用,都是在调用函数的位置将函数题展开.   一般来说,inline函数是不能递归的,不知道宏可不可以?  
  关于不同点就比较多:  
  1。宏是在编译器预处理的时候将函数展开的;而inline函数则是在编译的时候展开的;  
  2。使用宏很容易产生错误,为了避免这些,在定义的时候我们是将里面每个参数括起来,最后还要一起再括起来;   而inline函数则没有必要;  
  3。宏的参数检查比较弱,一个函数可能实用于int类型,也有可能实用于float类型;而inline函数则有较强的类型检查,实用于int就只能是int,如float想用的话,就要靠template了  
  4。暂时没想到,欢迎补充更正

阅读(2901) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~