您的位置:首页 > 其它

inline内联函数—macro宏的替代

2010-06-16 12:58 218 查看
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 我们经常可以看见有Get和Set属性方法,这是因为经常需要获取/保存变量的值,而如果定义为public,则破坏封装性,所以用函数访问私有变量的方法。
l 定义函数名的时候,由于C++类函数名必须与数据成员不同,所以,只能在前面加个有意义的Get和Set。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: