内联函数与宏定义的区别

来源:互联网 发布:软件测试 西安 编辑:程序博客网 时间:2024/05/23 23:46

使用宏和内联函数都可以节省在函数调用方面所带来的时间和空间开销。二者都采用了空间换时间的方式,在其调用处进行展开:
不同之处

  • 预编译时期,宏定义在调用处执行字符串的原样替换。在编译时期,内联函数在调用处展开,同时进行参数类型检查。
  • 内联函数首先是函数,可以像调用普通函数一样调用内联函数。而宏定义往往需要添加很多括号防止歧义,编写更加复杂(边际效应)
  • 宏定义是没有类型检查的,无论对还是错都是直接替换
    内联函数在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等
  • 内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)。

可以用内联函数完全替代宏。
在编写内联函数时,函数体应该短小而简洁,不应该包含循环等较复杂结构,否则编译器不会将其当作内联函数看待,而是把它决议成为一个普通函数。
有些编译器甚至会优化内联函数,通常为避免一些不必要拷贝和构造,提高工作效率。
频繁的调用内联函数和宏定义容易造成代码膨胀,消耗更大的内存而造成过多的换页操作