分类: C/C++
2007-12-20 00:27:52
内联函数是什么?
内联函数是代码被插入到调用者代码串处的函数。如同 #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。暂时没想到,欢迎补充更正