被豬隊友問到一個問題“引用是否佔用內存空間?”。突然有點懵逼,查閱一些資料以後更懵逼了。。。有的說佔用有的說不佔用,討論可以說很激烈。今天豬隊友自己找到了證據,此時此刻我作爲一個豬隊友決定站在“引用佔用內存空間”的這一派整理一下這些資料。
首先介紹一下使用引用時需要注意的事項:
- 引用不是一種獨立的數據類型,對引用只有聲明沒有定義
- 聲明一個引用時,必須進行初始化
- 聲明一個引用後,不能再使之作爲另一個變量的引用
- 不能建立引用數組
int a[3];
int &b[3]=a; //錯誤,不能建立引用數組
int &b=a[0]; //錯誤,不能作爲數組元素的別名 - 不能建立引用的引用,不能建立引用的指針
- 可以取引用的地址
引用本質上是一個指針常量,在內存中爲引用開闢了一個指針型的內存單元(利用如下代碼驗證)
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