C 中的引用變數在記憶體中存放的位置

2021-06-06 17:54:26 字數 1292 閱讀 6675

這幾天一直在思考一些問題,就是引用變數在一些教材上的說法是乙個變數的別名,那麼引用變數本身是否占用空間呢?

比如說:(本人使用的是vc++6.0編譯器)

int a = 10;

int & r = a;

cout << &a << endl;

cout << &r << endl;

從上面的例子當中可以看出:它們得出的結果是相同的,這時便會有人說,r和a所占用的記憶體空間是相同的,因為列印出來的位址是相同的。所以這些教材上對於引用變數的操作,稱之為宣告乙個引用變數,而非定義。因為教材的編寫者認為引用變數並不占用空間。

但是,如果你使用偵錯程式除錯一下,看一下彙編的**,就會產生新的迷惑了。

00401040   push        ebp

00401041   mov         ebp,esp

00401043   sub         esp,48h

00401046   push        ebx

00401047   push        esi

00401048   push        edi

00401049   lea         edi,[ebp-48h]

0040104c   mov         ecx,12h

00401051   mov         eax,0cccccccch

00401056   rep stos    dword ptr [edi]

5:        int a = 10;

00401058   mov         dword ptr [ebp-4],0ah

6:        int & r = a;

0040105f   lea         eax,[ebp-4]

00401062   mov         dword ptr [ebp-8],eax

從這段彙編**來看,

r和a的空間並不相同

,那這又怎麼解釋呢?

基於此,我得出了乙個非常合理的解釋:

如果定義(我認為引用變數占用空間,故稱之為定義)乙個引用變數,這個時候引用變數實際上在記憶體中已經申請了乙個空間,是4個位元組的(32bit系統中),它本身和指標是相同的。也就是說引用和指標對於編譯器本身來說操作是相同的,只是對於使用者來說操作不同而已。

接下來又會有人問:那麼為什麼上面程式的結果列印出來的位址是相同的呢?

其實這只是編譯器給你的假象而已。當你將r引用給了a,當想要列印&r的時候,編譯器會自動將其引用的物件的位址列印出來,也就是將a的位址列印出來,這也就是它們列印結果相同的原因了。

c語言 位域在記憶體中的存放

位域在實際開發中可能用的比較少,但是對於理解記憶體儲存資料非常有幫助!我們可以在結構體或共用體中描述乙個簡單的位域 struct st 首先我們先說說這個結構體在記憶體中所佔的大小 st變數占用了1個位元組,但只有3位 bit 用來儲存資料。當然如果用的是int型別,將會占用4個位元組,這是位元組對...

bmp在記憶體中的存放

bmp 儲存影象 每張圖按大小來儲存,即影象的長寬畫素大小。如果一張的畫素是 240x320,則此影象在記憶體的存放是乙個 240x320的陣列,每個陣列的元素是int整形 整數占用4個byte 數位相機中所謂的支援500w畫素就是這個意思,代表它能處理多大的圖形色彩資訊的能力,畫素越高,需要處理時...

資料在記憶體中的存放

在計算機系統中,執行的應用程式的資料都是儲存在記憶體之中 不同型別的資料,儲存的記憶體區域不同,其中包括 1 棧區 stack 由編譯器自動分配並釋放,一般存放函式的引數值,區域性變數等 2 堆區 heap 由程式設計師分配和釋放,如果程式設計師不釋放,程式結束時,可能會由作業系統 3 暫存器區 用...