參考佔用的空間
引用不是物件,與物件不同,它不能保證佔用一些連續的記憶體位元組。該標準沒有說明引用是否需要任何儲存。該語言的許多功能共同導致無法移植檢查引用可能佔用的任何儲存:
- 如果將
sizeof
應用於引用,則返回引用型別的大小,從而不提供有關引用是否佔用任何儲存的資訊。 - 引用陣列是非法的,因此無法檢查陣列假設引用的兩個連續元素的地址,以確定引用的大小。
- 如果採用引用的地址,則結果是引用的地址,因此我們無法獲得指向引用本身的指標。
- 如果類具有引用成員,則嘗試使用
offsetof
提取該成員的地址會產生未定義的行為,因為這樣的類不是標準佈局類。 - 如果類具有引用成員,則該類不再是標準佈局,因此嘗試訪問用於儲存引用的任何資料會導致未定義或未指定的行為。
實際上,在某些情況下,參考變數可以與指標變數類似地實現,因此佔據與指標相同的儲存量,而在其他情況下,參考可以根本不佔用空間,因為它可以被優化掉。例如,在:
void f() {
int x;
int& r = x;
// do something with r
}
編譯器可以自由地將 r
視為 x
的別名,並用 x
替換函式 f
的其餘部分中的所有 r
,而不是分配任何儲存來儲存 r
。