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
系統中),它本身和指標是相同的。也就是說引用和指標對於編譯器本身來說操作是相同的,只是對於使用者來說操作不同而已。
由於引用本身就是目標的乙個別名,引用本身的位址是乙個沒有意義的值,所以在c++中是無法取得引用的記憶體位址的。取引用的位址就是取目標的位址,c++本身就根本不提供獲取引用記憶體位址的方法
C 中 類 佔 記憶體問題
題目如下 若char是一位元組,int是4位元組,指標型別是4位元組,如下 class ctest virtual void mem fun private char m chdata int m ndata static char s chdata char ctest s chdata 0 問 ...
如何計算c 中開陣列中佔的記憶體
引入 在比賽中一般都會有陣列的身影,但是比賽時記憶體是一定的,若是操作不當,那麼正解也會被陣列而拖累,可是如何確保自己的陣列佔的記憶體的呢?首先要知道你自己開陣列是的型別是不一樣的記憶體的 也就是說型別不一樣,記憶體計算的方法就不一樣 16位編譯器 char 1個位元組 char 即指標變數 2個位...
C 物件占多大記憶體?
前幾天被問到,在c 裡建立乙個空類什麼都成員沒有,它佔多大記憶體?我一下子懵掉了,還真沒想過這個問題。後來查了下資料終於明白了,且聽我慢慢道來。首先我們看一下這個測試程式 include using namespace std class test main static int x main cl...