内联函数的作用

内联函数有什么用?

当编译器内联展开一个函数调用时,该函数的代码会被插入到调用代码流中(概念上类似于展开#define宏)。能够改善性能,因为优化器能够顺序集成被调用代码,即将被调用代码直接优化进调用代码中。

函数设定为内联,这只是个请求,而编译器可以忽略它。编译器可能会展开内联函数调用,也可能不展开。(这看上去非常模糊,但不要为之沮丧。这种灵活性其实有很大优点:这可以让编译器能够区别对待很长的函数和短的函数,另外如果选择了正确的编译选项,还能使编译器生成易于调试的代码。)

 

 

内联函数能改善性能么?

可能会,也可能不会。有时可以。也许可以。

内联函数可能会使代码速度更快,也可能使速度变慢。可能会使可执行文件变大,也可能变小。可能会导致系统性能下降,也可能避免性能下降。内联函数可能(经常是)与速度完全无关。

内联函数可能会使代码速度更快正如上面所说,顺序集成可能会移除很多不必要的指令,这可能会加快速度。

内联函数可能会使代码速度更慢过多的内联可能会使代码膨胀,在使用分页虚拟内存的系统上,这可能会导致性能下降。换句话说,如果可执行文件过大,系统可能会花费很多时间到磁盘上获取下一块代码。

内联函数可能会增加可执行文件尺寸:这就是上面所说的代码膨胀。例如,假设系统有100个内联函数,每个展开后有100字节,并且被调用了100次。这就会增加1MB的大小。增加这么1MB会导致问题吗?谁知道呢,但很可能就是这1MB导致系统性能下降。

内联函数可能会减少可执行文件尺寸:如果不内联展开函数体,编译器可能会要产生更多代码来压入/弹出寄存器内容和参数。对于很小的函数来说会是这样。如果优化器能够通过顺序集成消除雕大量冗余代码的话,那么对大函数也会起作用(也就是说,优化器能够使大函数变小)。

内联函数可能会导致系统性能下降内联可能会导致二进制可执行文件尺寸变大,由此导致系统性能下降。

内联函数可能会避免系统性能下降:即使可执行文件尺寸变大,当前正在使用的物理内存数量(即需要同时留在内存中的页面数量)却仍然可能降低。当f()调用g()时,代码经常分散在2个不同的页面上。当编译器将g()的代码顺序集成到f()后,代码通常会放在一个页面上。

内联函数可能会降低缓存的命中率:内联可能会导致内层循环跨越多行的内存缓存,这可能会导致内存和缓存频繁交换,从而性能下降。

内联函数可能会提高缓存的命中率:内联通常能够在二进制代码中就近安排所用到的内容,这可能会减少用来存放内层循环代码的缓存数量。最终这会使CPU密集型程序跑得更快。

内联函数可能与速度无关大多数系统不是CPU密集型的,而使I/O密集型的、数据库密集型的或是网络密集型的。这表明系统的瓶颈存在于文件系统、数据库或网络。除非你的“CPU速度表”指示是100%,否则内联函数可能不会使你的系统速度更快。(即使是CPU密集型的系统,也只有在被用到瓶颈之处时,内联才会有帮助。而瓶颈通常只存在于很少一部分代码中。)

内联函数如何在安全和速度上取得折衷?

在 C 中,你可以通过在结构中设置一个 void* 来得到“封装的结构”,在这种情况下,指向实际数据的 void* 指针对于结构的用户来说是未知的。因此结构的用户不知道如何解释void*指针所指内容,但是存取函数可以将 void* 转换成适当的隐含类型。这样给出了封装的一种形式。
不幸的是这样做丧失了类型安全,并且即使仅仅是访问结构体中的一个很不重要的字段也必须进行函数调用。(如果你允许直接存取结构的域,那么任何人都能直接存取该结构体了,因为他们必须了解如何解释 void* 指针所指内容;这样将使改变底层数据结构变的困难)。

虽然函数调用开销是很小的,但它会被累积。C++类允许函数调用以内联展开。这样让你在得到封装的安全性时,同时得到直接存取的速度。此外,内联函数的参数类型由编译器检查,这是对 C 的 #define 宏的一个改进

和宏不同的,还有内联函数的参数类型被检查,并且被正确地进行必要的转换。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值