Effective_C++:33、明智地应用inlining

本文探讨了内联函数的应用及注意事项,包括内联函数的工作原理、编译器处理方式、如何放置内联函数定义以及使用内联函数时可能出现的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

33、明智地应用inlining

1、inline函数

使用 inline函数时,函数的每一步都以函数代码取代。故将函数inlining,可能增加目标代码的大小(除非inline函数的函数体比“以函数调用”产出的代码更小)。但是他不需要承受函数调用时的成本(生成副本)。

2、编译器拒绝将函数inline时

inline与register一样,只是对编译器的提示、建议,并不是一个强制命令。

当编译器拒绝将函数inline时,理所当然,函数将与其他函数的调用动作相同。

首先,我们经常把inline函数定义也放在头文件中,这样多个编译单元可以包含该头文件并获得其中的inline函数定义。而对于非inline函数,若将定义放在头文件中,头文件被包含多次时则包含多份该函数的定义,在连接时发生错误。

若编译器拒绝将函数inline时,其定义在头文件中,然而其在被调用时视作非inline函数,则在连接时会出现错误。为此,旧规则规定,在未被inlined成功时,视作将此函数声明为static处理。此时,每个包含该函数的文件都有一个该函数的static副本。这将增加程序代码的体积。而新规则则只会生成一份函数副本。

同时,对一个成功inlined的函数进行取地址时,旧规则同样对每个编译单元都需要生成一个static副本,而新规则则只会生成一个。

对于构造函数、析构函数,其包含调用数据成员的构造函数与析构函数,只是这些代码由编译器来完成。

另外,对于inline函数,当改动函数时,所有用的该函数的程序都必须重新编译。而对于非inline函数则只需要重新连接即可(甚至采用动态连接库可以不知不觉地实现)。通常,含有static对象的函数避免被声明为inline。

最后,inline函数出错难以定位。无法设置断点、next等方式。

总之,不要随意使用inline,除非那些非常普通简洁的函数,以及那些程序中占重要效率地位的函数。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值