• c++|内联函数


     一、概念

    以inline修饰的函数叫做内联函数,编译时c++编译器会在调用函数的地方展开,而不会建立栈帧,提升了程序运行的效率

    例子: 

    1. #include
    2. using namespace std;
    3. int Add(int left, int right)
    4. {
    5. return left - right;
    6. }
    7. int main()
    8. {
    9. int ret = 0;
    10. ret = Add(1, 2);
    11. return 0;
    12. }

     查看反汇编代码,发现一个call指令

     如果在上述函数前增加inline关键字将其改成内联函数,在编译器期间编译器会将函数体替换函数的调用

    两个注意点:

    1.在debug环境下,默认不会对编译器优化,所以要查看inline函数得先开启设置,不然的话,即使加了inline,还是看不到inline函数展开的过程

    2.release环境下,不管什么,对编译器进行了很强大的优化

    debug环境: 

    右击该解决方案,选择属性,选择以下内容

    设置好后,再查看反汇编,此时没有了call指令 

     release环境:

    在release版本下,发现优化的更加厉害,前面的啥指令都不调用了, 也不开空间了。

    二、特性 

    1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,则在编译阶段函数体会替换函数调用,优点:少了调用开销,提高程序运行效率,缺点:可能使目标文件变大

    2.inline只是给编译器提供一个展开建议,至于实不实现展开看编译器,一般来说:函数规模较小、不是递归、不是频繁调用的inline函数编译器会展开函数体,否则会忽略其特性。 

    3.inline不建议声明和定义分离,分离会导致链接错误。因为inline函数被展开,就没有了函数地址,就没有了call指令,那么在链接时就会找不到定义 。look

    1. //fun.h
    2. #include
    3. using namespace std;
    4. inline void fun(int i);
    5. //fun.cpp
    6. #include "fun.h"
    7. void f(int i)
    8. {
    9. cout << i << endl;
    10. }
    11. //test.cpp
    12. #include "fun.h"
    13. int Add(int left, int right)
    14. {
    15. return left - right;
    16. }
    17. int main()
    18. {
    19. int ret = 0;
    20. ret = Add(1, 2);
    21. return 0;
    22. }

     编译结果:

  • 相关阅读:
    多模态交互式 AI 代理的兴起:探索 Google 的 Astra 和 OpenAI 的 ChatGPT-4o应用
    Spring @PostMapping 能在 URL 中带有参数吗
    SpringBoot-02-springBoot介绍及程序创建
    C++——模板
    记一次Android项目升级Kotlin版本(1.5 -> 1.7)
    Docker笔记-docker搭建nginx及移植
    pikachu——一、暴力破解模块通关教程
    jmeter教程系列(22)造数据
    急诊医学-急救医学-复习资料-总结-重点-笔记
    专访清华裘捷中:亚洲高校首个KDD最佳博士论文奖是如何炼成的?
  • 原文地址:https://blog.csdn.net/weixin_68201503/article/details/134541291