這幾天一直在思考一些問題,就是引用變數在一些教材上的說法是乙個變數的別名,那麼引用變數本身是否占用空間呢?
比如說:(本人使用的是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 暫存器區 用...