C 中 引用也佔記憶體

2021-09-30 10:18:22 字數 1035 閱讀 8067

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...