• 108查看
  • 0回复

[应用层软件] C语言基础-内联函数在头文件中的定义

[复制链接]

该用户从未签到

发表于 19-4-2024 22:13:30 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师




    前言

    inline关键字


      优点

      缺点

      使用注意

    头文件中定义函数

    内联函数在头文件中的定义

    总结

前言

在软件开发过程中,大家可能很少会遇到inline关键字,也可能很少见到头文件中定义函数体。没有用过不代表不能了解,菜就多练!哈哈哈~本文学习一下inline关键字,及在头文件中的使用。
inline关键字

在高质量C++/C 编程指南中,有很好的说明inline关键字:inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。意思就是说应该在函数定义时使用inline关键字来指示该函数为内联函数,在声明时没有必要再使用inline。

优点

使用inline关键的优点:
1.提高性能:内联函数的主要目的是减少函数调用的开销,包括传递参数、保存和恢复现场、跳转回原地址等。当函数非常小并且频繁调用时,将其内联化可以显著提升程序的运行速度。
2.提高代码可读性:对于简单的小函数,内联后可以避免函数调用堆栈,使得代码逻辑更加直观,特别是在嵌入式系统或者对性能要求极高的场景下。
缺点

1.代码膨胀:内联函数会导致最终生成的目标代码体积增大,尤其是在函数体较大或者函数被多次调用的情况下,可能导致存储空间占用增加以及可能影响内存管理(比如增加分页数量)。
2.不利于模块化和维护:内联函数的代码会分散到各个调用点,这可能使得代码更难以理解和维护,特别是当函数体发生变化时,所有包含此内联函数的调用点都需要重新编译。
3.限制了编译器优化:编译器在独立的函数中可以进行更多的优化,如循环展开、寄存器分配等,内联后可能会影响这些优化效果。
使用注意

有了上述优缺点,我们可以得到何时使用内联:
函数非常小并且频繁调用时
以下情况不适合使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。
inline定义的函数一定会成为内联函数吗?答:不一定。编译器根据自身的优化策略判断是否真的进行内联处理
头文件中定义函数

大家一般的认知应该是函数在源文件中定义,头文件中声明。那为什么头文件中不建议定义函数?
如果一个头文件定义了一个函数,而该头文件又被多个源文件包含时,在预处理时头文件展开,每个文件都有了一个该函数的定义,因为编译时是分隔的,所以到链接时,将所有文件关联在一起时,发现每个包含了该头文件的文件中有一个相同函数的定义,编译器就会报出重定义的错误。
所以在头文件中尽量不要进行函数的定义,只对其进行声明。否则如果有多个源文件链接时会报错
内联函数在头文件中的定义

回到本文标题,为什么内联函数要定义在头文件中?inline函数(即内联函数)对编译器而言必须是可见的,以便能够在调用点展开该函数,与非inline函数不同的是,inline函数必须在调用该函数的每个文件中定义。(也就是所谓的代码膨胀)
正因为如此,建议把inline函数的定义放到头文件中,在每个调用该inline函数的文件中包含该头文件。这种方法保证了每个inline函数只有一个定义,且程序员无需复制代码,并且不可能在程序的生命周期中引起无意的不匹配的事情。
当头文件中定义了内联函数,且编译器编译为了内联函数,则源文件中包含该头文件后,对应的函数代码将会在该源文件中自动被复制。
可能有在思考的同学又会有疑问了(如果你没想到这个问题,我也不怪你)
函数是否真的内联是由编译器决定的,若软件开发者在头文件中定义了内联函数,而编译器却又未执行内联处理,那在多个源文件包含时不就又会报重定义的错误吗?
答:如果是单纯的只定义inline关键字,确实是有可能会出现这种情况的。所以一般在定义内联函数时,除了inline之外,还会在前面加上static关键字,成为LOCAL_INLINE,有了static关键字的存在,即使编译器没有将定义的inline函数进行inline处理,也不会出现重定义的错误。
总结

如果函数真的成了inline函数,那么在调试过程中,将无法通过打断点的方式调试该函数执行过程。如果想要方便调试inline函数,一般可以通过禁用编译器优化,不执行内联。例如,在Greenhills中,可以通过配置-Omaxdebug来实现。

C语言基础-内联函数在头文件中的定义w1.jpg

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 3-5-2024 10:31 , Processed in 0.302733 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.