引用是否佔用內存空間?

原文鏈接:https://blog.csdn.net/jgj123321/article/details/75091539

被豬隊友問到一個問題“引用是否佔用內存空間?”。突然有點懵逼,查閱一些資料以後更懵逼了。。。有的說佔用有的說不佔用,討論可以說很激烈。今天豬隊友自己找到了證據,此時此刻我作爲一個豬隊友決定站在“引用佔用內存空間”的這一派整理一下這些資料。

首先介紹一下使用引用時需要注意的事項:

  1. 引用不是一種獨立的數據類型,對引用只有聲明沒有定義
  2. 聲明一個引用時,必須進行初始化
  3. 聲明一個引用後,不能再使之作爲另一個變量的引用
  4. 不能建立引用數組
    int a[3];
    int &b[3]=a; //錯誤,不能建立引用數組
    int &b=a[0]; //錯誤,不能作爲數組元素的別名
  5. 不能建立引用的引用,不能建立引用的指針
  6. 可以取引用的地址

引用本質上是一個指針常量,在內存中爲引用開闢了一個指針型的內存單元(利用如下代碼驗證)

struct Test
{
int a[5];
int &b;
}

int main()
{
using std::cout;
cout<<"結構體佔用的內存空間字節大小爲:"<<sizeof(Test);
}

運行結果爲:24
因此引用同指針一樣,佔用一個4字節的內存空間(32位)

看完上述代碼之後,不禁產生一個疑問。注意事項第二條指出:聲明一個引用時,必須進行初始化。那麼,上述代碼結構體中的引用並沒有初始化,爲什麼編譯通過了呢???經過一系列的互相撕逼,最後得出一個結論:注意事項的第二條說法不嚴謹,應該爲:引用分配內存空間時,必須進行初始化!
上述代碼之所以可以通過編譯是因爲:代碼中只是對結構體進行聲明,系統並沒有對其分配實際的內存單元。如果此時在main函數中創建一個結構體對象,編譯器就會報錯。

int main()
{
using std::cout;
Test test;//創建結構體對象,分配內存單元。
cout<<"結構體佔用的內存空間字節大小爲:"<<sizeof(Test);
}

error C2512:“Test”: 沒有合適的默認構造函數可用.

————————————————
版權聲明:本文爲CSDN博主「進擊的路飛桑」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/jgj123321/article/details/75091539

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章