C++第6课--内联函数分析

本文学习自 狄泰软件学院 唐佐林老师的 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++$ 

在这里插入图片描述

在这里插入图片描述

发布了200 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/104087366
今日推荐