怎么建立局域网网站国家工商注册查询系统官网
怎么建立局域网网站,国家工商注册查询系统官网,wordpress 增加小工具,网站架构模式用哪种一、内联引出的问题
在将一个内联变量定义到编译单元时#xff0c;然后再按正常的方式使用时#xff0c;编译会报一个错误“odr-used”。ODR#xff0c;One Definition Rule#xff0c;单一定义规则。在C/C程序中#xff0c;变量的定义只能有一处#xff0c;至于ODR的规…一、内联引出的问题
在将一个内联变量定义到编译单元时然后再按正常的方式使用时编译会报一个错误“odr-used”。ODROne Definition Rule单一定义规则。在C/C程序中变量的定义只能有一处至于ODR的规则如何定义这个在C的标准文档中说明的非常清楚。大家可以去查询有时间再总结一下一起分析。 这个问题就回到了inline的问题相关即inlineand odr-used变量和函数在每个编译单元是可以存在一个定义的。这也是为什么inline的变量可以在不同的编译单元使用的原因。
二、内联的优势
在前面分析的基础上可以进一步提出内联对编译是一种类似于提示的机制告诉编译器你可以看到更多的代码和更大的范围至于能不能优化就看编译器的能力了。 编译器在得到更多的信息后可以有以下几个方面的优化 1、IPOInterprocedural Optimization 过程优化这个其实非常好理解比如for循环内的变量在低版本的编译器中可能是一个需要手动优化的目标但在高版本编译器会自动根据情况优化到手动指定的效果。同样对于一些运算中间过程可以进行省略而直接使用结果常量折叠。这就需要编译器看到的代码要相对完全包括本文提到的inline。
2、LTOLink Time Optimization 链接时优化它其实是IPO的一部分。即在链接时对相关的代码进行优化。也就是说编译器会根据不同的编译单元编译出不同的目标文件这些目标文件就有可能进行链接时的优化。
可能有人因此会说既然编译器如此高大威猛为何还需要程序员小白们费心的搞这个inline其实非常好理解再威猛的战士也有疏漏的时候儿不可能面面俱到而开发者就是给编译器一个指标或者说建议让其知晓此处可能可以优化。另外一个就是解决文章一开头提到的ODR的问题。
三、说明
其实在前面就提到过对虚拟函数的内联优化支持可以肯定的说普遍意义上讲肯定是内联无法适配虚函数。但是在一些特殊的情况下比如下面的代码
class A{
public:virtual void Test(){...}
}
class B:public A
{
public:virtual void Test(){...}
}
inline void Get(A a){a.Test();
}
int main(){
B b;
b.Test(b);
return 0;
}其实这种就是典型的编译完全可以明白并确定inline函数中的a具体的对象所以就可以进行内联的优化处理其它的情况也是类似。编译器对代码的优化随着技术的进步在不断的推进比如现在的AI大模型的出现以后会不会出现完全由编译器为主而人为设置标记为辅的编程方式也不好说。毕竟AI自己编程都出现了自已编程自己编译自己测试并部署也不是不可能这是不是《终结者》里的天网的雏形
四、总结
许多的技术看起来很简单用起来也没有什么可以体察到困难的地方。比如这个inline反正写不写以后编译器还要看自己心情来处理。但其实真正的向内部观察其原理会发现有很多技术点在等着你去融会贯通。可以把inline的函数和变量通过汇编去深入分析一下再查看一下它的具体的实现和优化的过程好多细节的明白会是开发者提升自己能力的一个重要的契机
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/88414.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!