2019独角兽企业重金招聘Python工程师标准>>>
刚开始学习c++ 学完指针后,其细节比较好明白,但学到引用了以后,只知其表却不知其底层的实现机制,虽然知道引用是别名、声明必须同时初始化等等,但这只是概念性的东西没有从底层说明其到底是怎么实现的。到网上查了之后,就底层实现来说比较认同其实现原理与指针有很大的关系。网上前辈们用汇编对c++进行编译后,也确实发现的确有一个内存块用来保存引用。综合以上我有了自己新的想法,比如如下一个最简单void kk(int &a){};函数。其参数为一个引用,那么首先是在堆中申请一个内存空间,然后在这个内存中放入一个指针,且该指针指向所传参数的a的地址,然后将这整个内存空间压栈。(注意由于是从堆中申请的一块内存,所以无法通过手段拿到内存,而这块内存的地址是真正的“引用地址”只是我们无法获取),既然无法通过手段拿到该内存进行操作那么,那么该内存里面的内容也就是指针也无法操作,所以但内存申请到时,也只能趁此时机对里面的指针进行初始化,因为以后无法对该内存操作修改。这也说明了引用申明是必须初始化,且一旦初始化和其对象进行绑定无法再次修改(再次提醒引用为上面的内存)。注意此时的内存块已经被压栈,也就说对于编译器来说该内存块已经锁定,就再这个栈中。因此编译器是可以对其进行操作的。
有些人会有困惑为什么我无法修改这个内存块,而编译器却可以。我觉得这涉及到层面的原因,在c++语言这个层面上是无法操作从堆中申请出来的内存块的,因为没有声明一个指针指向他,有点像内存泄露的样子,但由于是堆(空间很大且函数执行完后该内存回收所以无关紧要)。而对于编译器来说,他所处的层面就较之前更下了,由于编译器已经锁定了该内存块是在栈中,而栈对于编译器也是锁定状态,因此编译器是可以对该内存块进行操作的。
以上观念纯属YY 由于想搞清楚他的实现机制,但苦于实在是没有前辈借鉴只能这样,希望看完此博文的前辈们如果有更加权威的解释教导下