inline内联函数—macro宏的替代

来源:互联网 发布:windows编程入门书籍 编辑:程序博客网 时间:2024/06/08 13:44

1)          macroC++的特殊(唯一)用途

l       方便输出变量名和值 #

#define Print(x) cout<< #x <<”=”<<x<<endl;

int a = 10;

Print( a ); // a = 10

 

l       连接变量名##

#define FIELD(a) char* a##_string; int a##_size

FIELD(one);

FIELD(two);

 

2)          macro的优缺点

l       宏不需调用函数就像函数一样的使用,也用于常量的定义。宏工作在预处理器层

l       宏的优点

没有了参数压栈、Call指令、Ret指令等函数开销

l       宏的缺点

1)      宏使得代码可读性差,需要注意很多东西,如++, --,表达式括号等问题

2)      宏像函数,而又不是函数,也不是表达式,也不是定义,容易迷惑读者

3)      宏不能访问类的数据成员,导致其不能作为成员函数

4)      宏没有地址,只是简单的替换,没有函数地址,不能调试

 

3)          内联inline函数的原理

l       工作在编译器层,编译器负责做参数检查,返回值类型转换,这是预处理器做不了的。

l       对于任何函数,编译器都会把函数声明放入符号表,而inline函数,同时将函数体(源码或汇编取决于编译器)放入符号表。当调用时,做必要的检查,然后插入代码,对于类成员函数,还会插入this指针。

 

4)          内联inline函数的使用

l       inline的使用

1)      在类中,如果声明和定义写在一起,则是inline函数

2)      在类外如果定义inline函数,必须声明和定义写在一起

3)      例如,inline void Func(); 然后再别处实现,则没有inline的效果

4)      一般将inline函数定义在头文件中,多个文件包含不会出现重定义(内部链接,保存在符号表里)

 

5)          内联inline函数的优缺点

l       inline函数的优点

1)      保留了宏的优点,当然,其不能定义常量,由const代劳

2)      解决了宏的缺点,除了不能调试

l       inline函数的缺点

1)      和宏一样,其不能调试,inline函数没有地址

2)      inline只是对编译器的一种暗示,编译器有最终inline与否的权利

当有循环时,一般不inline

当函数体超复杂或较大时,一般不inline

当函数内递归调用时,绝对不inline

当须取函数指针时,绝对不inline

3)      可能引起代码膨胀

 

6)          一个提示

l       当函数很大且复杂时,内联本身所带来的性能提升相比之下是微弱的,而且会引起代码膨胀,一般不用inline。编译器本身也会杜绝这种inline

l       内联函数不会出现重复定义,所以,在项目初期可以被大量使用;在后期可以有选择性的inline——先让它工作起来,然后再优化

l       inline函数不能是virtual的,因为virtual函数是需要有地址的。

 

7)          一个故事

l       我们经常可以看见有GetSet属性方法,这是因为经常需要获取/保存变量的值,而如果定义为public,则破坏封装性,所以用函数访问私有变量的方法。

l       定义函数名的时候,由于C++类函数名必须与数据成员不同,所以,只能在前面加个有意义的GetSet

 

原创粉丝点击