欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ inline函数与宏定义的区别

程序员文章站 2022-03-15 15:16:43
...

内联(inline)函数

通过inline关键字将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开(将函数体有关代码嵌入到调用处)。

举个例子:

//寻找两个string对象中较短的那个
inline const string & shortString(const string &s1, const string &s2)
{
    return s1.size() <= s2.size() ? s1 : s2;
}

那么如下调用:
cout << shortString(s1, s2) << endl;

将在编译过程中展开成类似于下面的形式:
cout (s1.size() <= s2.size() ? s1 : s2) << endl;

从而消除了shortString函数的运行时开销

 

共同点: 

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

内联函数和带参数的宏定义实现的功能是一样的。

区别:


(1)  在预编译时期,宏定义在调用处执行字符串的原样替换(宏展开)。在编译时期,内联函数在调用处展开,同时进行参数类型检查,宏定义不会进行参数类型检查。

(2)  内联函数首先是函数,可以像调用普通函数一样调用内联函数。而宏定义往往需要添加很多括号防止歧义,编写更加复杂。
(3)  内联函数可以作为某个类的成员函数,这样可以使用类的保护成员和私有成员。而当一个表达式涉及到类保护成员或私有成员时,宏就不能实现了(无法将this指针放在合适位置)。

可以用内联函数完全替代宏。


在编写内联函数时,函数体应该短小而简洁,不应该包含循环等较复杂结构,否则编译器不会将其当作内联函数看待,而是把它决议成为一个静态函数。

有些编译器甚至会优化内联函数,通常为避免一些不必要拷贝和构造,提高工作效率。

频繁的调用内联函数和宏定义容易造成代码膨胀,消耗更大的内存而造成过多的换页操作。