剛開始學習c++ 學完指針後,其細節比較好明白,但學到引用了之後,只知其表殊不知其底層的實現機制,雖然知道引用是別名、聲明必須同時初始化等等,但這只是概念性的東西沒有從底層說明其究竟是怎麼實現的。到網上查了以後,就底層實現來講比較認同其實現原理與指針有很大的關係。網上前輩們用匯編對c++進行編譯後,也確實發現的確有一個內存塊用來保存引用。綜合以上我有了本身新的想法,好比以下一個最簡單void kk(int &a){};函數。其參數爲一個引用,那麼首先是在堆中申請一個內存空間,而後在這個內存中放入一個指針,且該指針指向所傳參數的a的地址,而後將這整個內存空間壓棧。(注意因爲是從堆中申請的一塊內存,因此沒法經過手段拿到內存,而這塊內存的地址是真正的「引用地址」只是咱們沒法獲取),既然沒法經過手段拿到該內存進行操做那麼,那麼該內存裏面的內容也就是指針也沒法操做,因此但內存申請到時,也只能趁此時機對裏面的指針進行初始化,由於之後沒法對該內存操做修改。這也說明了引用申明是必須初始化,且一旦初始化和其對象進行綁定沒法再次修改(再次提醒引用爲上面的內存)。注意此時的內存塊已經被壓棧,也就說對於編譯器來講該內存塊已經鎖定,就再這個棧中。所以編譯器是能夠對其進行操做的。 c++
有些人會有困惑爲何我沒法修改這個內存塊,而編譯器卻能夠。我以爲這涉及到層面的緣由,在c++語言這個層面上是沒法操做從堆中申請出來的內存塊的,由於沒有聲明一個指針指向他,有點像內存泄露的樣子,但因爲是堆(空間很大且函數執行完後該內存回收因此可有可無)。而對於編譯器來講,他所處的層面就較以前更下了,因爲編譯器已經鎖定了該內存塊是在棧中,而棧對於編譯器也是鎖定狀態,所以編譯器是能夠對該內存塊進行操做的。 函數
以上觀念純屬YY 因爲想搞清楚他的實現機制,但苦於實在是沒有前輩借鑑只能這樣,但願看完此博文的前輩們若是有更加權威的解釋教導下 學習