C++(内联函数的使用----第6课)
程序员文章站
2024-02-25 11:37:04
...
1.C++中的const常量可以替代宏常数定义
如:
const int A = 3; <–> #define A 3
C++中是否有解决方案替代宏代码片段呢?有,内联函数(c 中的宏定义只是预处理器的粘贴复制,而内联函数是c++编译器的操作,自然会有类型判别,这解决了c中宏定义带来的一些可能的问题。)
看代码(可以看出宏定义的问题)
#include <stdio.h>
#define FUNC(a, b) ((a) < (b) ? (a) : (b))
inline int func(int a, int b)
{
return a < b ? a : b;
}
int main(int argc, char *argv[])
{
int a = 1;
int b = 3;
int c = FUNC(++a, b);
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
return 0;
}
3 3 3
换成内联函数的话,自然就是 2 3 2
为什么会出现3 3 3 的定义,我们不妨替代一下看看
((a++)<(b)?(a++):(b))
2<3?3:3
所以最终是错的啦!
但是内联函数只是一个请求,你不清楚有没有用,这时候要设置vs中属性它默认为同意,就OK啦!
小结:内联函数具有普通函数的特征(参数检查,返回类型等)函数的内联请求可能被编译器拒绝
函数被内联编译后,函数体直接扩展到调用的地方宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程,因此可能出现副作用。现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如:g++:attribute((always_inline))属性 MSVC:_forceinline。
6-2 内联函数深度示例
#include <stdio.h>
//__forceinline
//__attribute__((always_inline))
inline
int add_inline(int n);
int main(int argc, char *argv[])
{
int r = add_inline(10);
printf(" r = %d\n", r);
return 0;
}
inline int add_inline(int n)
{
int ret = 0;
for(int i=0; i<n; i++)
{
ret += i;
}
return ret;
}
3.注意事项(其实现在问题不大,不存在这么多的限制的)
C++中inline内联编译的限制
不能存在任何形式的循环语句
不能存在过多的条件判断语句
函数体不能过于庞大
不能对函数进行取值操作
函数内联声明必须在调用语句之前
小结:
C++中可以通过inline声明内联函数
编译器直接将内联函数体扩展到函数调用的地方
inline只是一种请求,编译器不一定允许这种请求
内联函数省去了函数调用时压栈,跳转和返回的开销