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