本文学习自 狄泰软件学院 唐佐林老师的 C++课程
引入:C++内联函数的引入是为了替换C中宏代码块功能
实验1 :宏代码块 VS 内联函数
注意:在C++开发中首选内联函数定义代码块,而不是宏
实验2:强制内联
C语言中的宏常量只是在预处理期间进行键的文本替换,它的副作用是并不会进行任何的语法检查,类型检查。所以在C++中 对const关键字进行了升级,const所定义的常量就成为了真正意义上的常量,而不是只读变量,所以在C++中 如果我们想使用宏常数,我们可以直接用const定的常量来替换宏常量。另外C中我们也可以定宏代码块,看上去是函数,但是并不是函数,因此宏代码块的使用,经常是带有副作用的。在C++中提供了解决方案来替换C中的宏代码块-----内联函数
当C++编译器没有满足函数的内联请求时,该内联函数就成为了普通的函数,同样存在压栈,跳转,返回等开销。
实验1 :宏代码块 VS 内联函数
#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;
}
mhr@ubuntu:~/work/c++$ g++ 6-1.cpp
mhr@ubuntu:~/work/c++$ ./a.out
a = 3
b = 3
c = 3
mhr@ubuntu:~/work/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;
}
mhr@ubuntu:~/work/c++$ g++ 6-1.cpp
mhr@ubuntu:~/work/c++$ ./a.out
a = 2
b = 3
c = 2
mhr@ubuntu:~/work/c++$
attribute() 相对于g++编译器而言,是关键字,而不是标准c++语法中的所支持的。而是特殊的g++编译器所支持的东西。
实验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;
}
mhr@ubuntu:~/work/c++$ g++ 6-2.cpp
\mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$ ./a.out
r = 45
mhr@ubuntu:~/work/c++$
mhr@ubuntu:~/work/c++$