服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++超详细分析讲解内联函数

C++超详细分析讲解内联函数

2022-12-15 14:04Bright-SKY C/C++

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数

宏函数(带参数的宏)的缺点

第一个问题:宏函数看起来像一个函数调用,但是会有隐藏一些难以发现的问题。

例如:

?
1
2
#define FUN(x, y) (x * y)
printf("%d", add(3, 3 + 2))    //3 * 3 + 2 = 11

以上情况可以通过加 “()” 解决:

?
1
2
#define FUN(x, y) (x * y)
printf("%d", add(3, (3 + 2)))    //3 * (3 + 2) = 15

特殊情况加()也保证不了参数的完整性:

?
1
2
3
4
5
6
7
8
#define GET_MAX_DATA(a, b) ((a)>(b)?(a):(b))
void test02()
{
    int a = 3;
    int b = 5;
    //((a)>(++b)?(a):(++b))  无法保证参数的完整性
    printf("最大值为:%d\n", GET_MAX_DATA(a,++b));//7
}

第二个问题是c++特有的,预处理器不允许访问类的成员,即预处理器宏不能用作类的成员函数

内联函数:内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型的安全检查,又可以作为成员函数

内联函数:是一个真正的函数。函数的替换 发生在编译阶段

inline修饰的函数就是内联函数

?
1
2
3
4
inline int myAdd(int x, int y)//inline必须出现在函数的定义处
{
    return x+y;
}

内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数, 返回值类型的安全检查,又可以作为成员函函数。

内联函数:是在编译阶段 完成的替换。

?
1
2
3
4
5
6
7
8
inline int my_mul(int x,int y)
{
    return x*y;
}
void test01()
{
    cout<<"my_mul = "<<my_mul(10+10,20+20)<<endl;
}

任何在类内部定义的函数自动成为内联函数。

内联函数的特点

1、能保证参数的完整性

2、有作用域的限制,可以成为类的成员

3、类中的成员函数 默认都是内联函数(不用inline)

内联函数的要求:

不能存在任何形式的循环语句 不能存在过多的条件判断语句 函数体不能过于庞大 不能对函数进行取地址操作。

内联仅仅只是给编译器一个建议。(具体处理方式由编译器来决定)

宏函数和内联函数的区别

宏函数:

预处理阶段完成替换、没有出入栈的开销、不能保证参数的完整性、没有作用域限制、不能作为类的成员

内联函数:

编译阶段完成替换、没有出入栈的开销、能保证参数的完整性、有作用域限制、能作为类的成员

到此这篇关于C++超详细分析讲解内联函数的文章就介绍到这了,更多相关C++内联函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_34981463/article/details/124979909

延伸 · 阅读

精彩推荐
  • C/C++详解C++的反调试技术与绕过手法

    详解C++的反调试技术与绕过手法

    反调试技术,恶意代码会用它识别自身是否被调试,或者让调试器失效,给反病毒工程师们制造麻烦,拉长提取特征码的时间线,本章将具体总结常见的反...

    lyshark8362021-11-18
  • C/C++Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享)

    下面小编就为大家带来一篇Linux下C语言的几道经典面试题小结(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看...

    C语言教程网5732021-05-13
  • C/C++C++实现合并排序的方法

    C++实现合并排序的方法

    这篇文章主要介绍了C++实现合并排序的方法,实例分析了合并排序的原理与相关实现技巧,需要的朋友可以参考下...

    Jack_Wong20105392021-03-04
  • C/C++opencv摄像头捕获识别颜色

    opencv摄像头捕获识别颜色

    这篇文章主要介绍了opencv摄像头捕获识别颜色,用opencv通过摄像头捕获识别颜色,红色蓝色等,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    helloed024972021-07-31
  • C/C++C语言实现冒泡排序的思路以及过程

    C语言实现冒泡排序的思路以及过程

    冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。本文给大家介绍的非常详细...

    飞人01_0110102022-01-06
  • C/C++详解C语言中二分查找的运用技巧

    详解C语言中二分查找的运用技巧

    本文主要介绍了二分查找在实际中的应用,通过分析几个应用二分查找的实例,总结下能使用二分查找算法的一些共同点,感兴趣的可以了解一下...

    枫叶9182022-11-01
  • C/C++C++实现LeetCode(24.成对交换节点)

    C++实现LeetCode(24.成对交换节点)

    这篇文章主要介绍了C++实现LeetCode(24.成对交换节点),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang11912021-11-25
  • C/C++C语言中计算字符串长度与分割字符串的方法

    C语言中计算字符串长度与分割字符串的方法

    这篇文章主要介绍了C语言中计算字符串长度与分割字符串的方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网5082021-03-07