• 【C++】内联函数 ③ ( C++ 编译器 不一定允许内联函数的内联请求 | 内联函数的优缺点 | 内联函数 与 宏代码片段对比 )






    一、内联函数不一定成功




    1、内联函数的优缺点


    " 内联函数 " 不是在运行时调用的 ,

    " 内联函数 " 是 编译时 将 函数体 对应的 CPU 指令 直接嵌入到调用该函数的地方 ,

    从而 降低了 函数调用的开销 , 提高了程序的执行效率 ;


    内联函数 的 缺点 也很明显 , 就是会增加代码的大小 , 调用了多少次内联函数 , 就要拷贝多少次内联函数的代码指令到调用的地方 ;

    要谨慎使用 " 内联函数 " , 避免不必要的 开销 和 代码膨胀 ;


    2、C++ 编译器 不一定允许内联函数的内联请求


    由于 " 内联函数 " 会导致不必要的 开销 和 代码膨胀 , 因此 , C++ 编译器并不一定保证内联请求的成功 ;

    使用 inline 关键字 可以请求 C++ 编译器将函数进行内联 , 但是编译器并不一定会接受这个请求 ;


    权衡利弊 : " 内联函数 "是否 成功内联 取决于 C++ 编译器 的 实现 和 优化策略 ;

    • 内联函数 优点 是 可以减少函数调用的开销,提高程序的执行效率 ;
    • 内联函数 缺点 是 会增加代码的大小 , 会降低程序的性能 ;

    因此,编译器在决定 " 内联函数 " 是否 内联时 , 会进行权衡 内联带来的性能提升 和 代码大小增加的开销 ;


    3、是否内联决定权在编译器手中


    是否内联决定权在编译器手中 : 在 C++ 语言中,inline关键字只是对编译器的建议,编译器可以根据自己的 优化策略 自由决定是否内联函数 ;

    在 普通函数 声明和定义 位置 前面加上 inline 关键字 ,

    • 只是 建议 C++ 编译器将该函数内联 , 并不强制要求编译器内联函数 ,
    • 如果编译器决定不内联函数 , 该 内联函数 作用 等同于 普通函数 ;

    最终 内联函数 是否内联成功 , 由 编译器 决定 ;





    二、内联函数 与 宏代码片段对比




    1、内联函数


    " 内联函数 " 的 本质是 函数 , 其是一种 特殊的函数 ;


    " 内联函数 " 有 普通函数 的特征 , 即 :

    • 定义时 有 函数名 , 参数列表 , 返回值类型 , 函数体 ;
    • 执行时 有 参数检查 , 返回值类型检查 ;

    内联函数 的 inline 关键字 只是请求 C++ 编译器 将 该函数进行内联 , 具体 C++ 是否同意 , 需要根据 C++ 编译器的优化策略决定 , 可能同意 , 也可能不同意 ;

    如果 C++ 编译器 不同意 内联请求 , 则该 内联函数 就是 普通函数 , 当做 普通函数 进行调用处理 ;


    2、宏代码片段


    " 宏代码片段 " 本质 是 宏定义 ;

    宏代码片段 是由 预处理器 进行处理 , 执行的操作是 简单的文本替换 ;

    宏代码片段 不是函数 , 没有函数那么强大的功能 , 执行时不会进行 参数和返回值 的类型检查 , 没有编译的过程 ;

  • 相关阅读:
    BeautifulSoup在数据采集中的应用
    【毕业设计】机器视觉手势检测和识别系统 - python 深度学习
    第五章《类的继承》第6节:instanceof运算符
    【ONE·Linux || 多线程(二)】
    论文笔记:Lost in the Middle: How Language Models Use Long Contexts
    numpy常用创建
    海藻酸钠-peg-环糊精|alginate-peg-Cyclodextrin
    每日一题·作用域链的理解(11/30)
    使用开源库libyuv中替换开源汇编接口,解决汇编接口中的崩溃问题
    【无标题】
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132644064