跟我学C++中级篇——内联补遗

一、内联引出的问题

在将一个内联变量定义到编译单元时,然后再按正常的方式使用时,编译会报一个错误“odr-used”。ODR,One Definition Rule,单一定义规则。在C/C++程序中,变量的定义只能有一处,至于ODR的规则如何定义,这个在C++的标准文档中说明的非常清楚。大家可以去查询,有时间再总结一下一起分析。
这个问题就回到了inline的问题相关,即inline(and odr-used)变量和函数,在每个编译单元是可以存在一个定义的。这也是为什么inline的变量可以在不同的编译单元使用的原因。

二、内联的优势

在前面分析的基础上,可以进一步提出,内联对编译是一种类似于提示的机制,告诉编译器,你可以看到更多的代码和更大的范围,至于能不能优化,就看编译器的能力了。
编译器在得到更多的信息后,可以有以下几个方面的优化:
1、IPO(Interprocedural Optimization)
过程优化,这个其实非常好理解,比如for循环内的变量,在低版本的编译器中可能是一个需要手动优化的目标,但在高版本编译器会自动根据情况优化到手动指定的效果。同样对于一些运算中间过程可以进行省略而直接使用结果(常量折叠)。这就需要编译器看到的代码要相对完全,包括本文提到的inline。

2、LTO(Link Time Optimization)
链接时优化,它其实是IPO的一部分。即在链接时对相关的代码进行优化。也就是说,编译器会根据不同的编译单元编译出不同的目标文件,这

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值