芯群面试之——C++中宏与内联函数

呵呵,今天在芯群面试时被问到这个题目了,记得之前刚看了宏定义的相关知识,但是在回答时对内联函数有的含糊了。回来找了些资料在总结一下。

 呵呵先来上几个之之前比较有印象的几个宏,大小MIN, MAX就不提了

交换: #define SWAP(A,B) {A=A^B; B=B^A; A=A^B}      //一个数按位异或两次同一个数又回来了

拼接:#define A(x) T_##x    //将 T_ 和 x 拼接     eg.A(test) -> T_test

加单引号: #define B(x) #@x        //给 x 加单引号  eg:    B(x) -> 'x'

加双引号:  #define C(x) #x                //给 x 加双引号    C(test) -> "test"

内联函数是什么?
        内联函数是代码被插入到调用者代码串处的函数。用inline定义的。例如: inline string dbtest(int a); 

先说共同点:

如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,就是都不会引起函数的调用,都是在调用函数的位置将函数题展开. 。一般来说,inline函数是不能递归的,尤其是内联函数能够通过调用(“过程化集成”)被编译器优化。


宏与内联函数的区别:  
  1.宏是在编译器预处理的时候将函数展开的;而inline函数则是在编译的时候展开的;  
  2.使用宏很容易产生错误,为了避免这些,在定义的时候我们是将里面每个参数括起来,最后还要一起再括起来,而inline函数则没有必要;
  3.宏的参数检查比较弱,一个函数可能实用于int类型,也有可能实用于float类型;而inline函数则有较强的类型检查,实用于int就只能是int,如float想用的话,就要靠template了。

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

 

另外在参考一些吧,可惜没早点看到这些

http://blogold.chinaunix.net/u/11077/showart.php?id=151918

一个内联函数的例子:

#i nclude <iostream>
#i nclude <string>
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::???。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值