我正在學習 C 中的參考。特別是,我了解到參考不是實際物件。相反,它們指的是其他一些物件。也就是說,參考只是其他物件的別名。
然后我遇到了這個說:
重要提示:即使參考通常使用底層匯編語言中的地址來實作,但請不要將參考視為指向物件的有趣指標。參考是物件,只是具有另一個名稱。它既不是指向物件的指標,也不是物件的副本。它是物件。沒有 C 語法可以讓您對參考本身與它所參考的物件分開進行操作。
我知道上面的參考意味著我們不能獨立于它所參考的物件對參考本身進行操作,但它似乎仍然暗示“參考是一個物件”。
另外,我遇??到了下面給出的句子:
在 ISO C 中,參考不是物件。因此,它不需要任何記憶體表示。
我沒有第二條引文的鏈接,但我在某處 SO 的一篇文章中讀到了它。
我的問題是,假設第二個參考也來自標準(可能不是這種情況),這兩個參考的陳述是否相互矛盾。或者至少第一個報價具有誤導性。哪一個是正確的。
我目前的理解(通過閱讀 C Primer 5th edition 等書籍)是參考是物件的別名。這使我想到他們不應該在記憶體中占用任何空間。
uj5u.com熱心網友回復:
重要提示:即使參考通常使用底層匯編語言中的地址來實作,但請不要將參考視為指向物件的有趣指標。參考是物件,只是具有另一個名稱。...
注釋是非正式的,通常不應被解釋為嚴格的規則。如果一種解釋與標準規則相矛盾,那么這種解釋就是錯誤的。
參考和物件是不同種類的物體。參考不是與它命名的物件不同的物件。不可能形成指向參考的指標。“指向參考的指標”甚至不是有效的型別類別。
該注釋試圖說參考“是”它命名的物件,即使用參考正在使用被參考的物件。
我正在考慮確認參考是否占用任何空間
參考占用空間或不占用空間。由語言實作決定是否在每種情況下都需要空間。
標準報價:
[dcl.ref] 未指定參考是否需要存盤
在標準規范之外,如果您想要一個使用空間的參考示例,請嘗試將參考成員添加到類中,您很可能會觀察到類的大小增加了。
因為指標占用空間,所以參考也應該占用空間。...
指標確實在標準指定的抽象機器中占據空間。但如果你從不觀察存盤,那么存盤完全有可能在實踐中不存在。參考和指標之間的一個顯著區別是您不能直接觀察參考的存盤。
哲學家:“如果一棵樹倒在一臺抽象機器中,而周圍沒有人觀察它,它會產生影響嗎?”
優化師:“如果我能幫上忙的話。”
uj5u.com熱心網友回復:
參考提供了另一種參考物件的方式。這在通過參考函式傳遞引數時特別有用。更正式地說,參考是系結到變數的別名,在這種情況下,包括匿名臨時變數。
幸運的是,我們不需要關心它們是如何實作的。那是編譯器的作業,技術各不相同。C 標準不要求它們占用任何記憶體。
順便說一句,有一種區分參考型別的方法。不可分離性實際上更多的是不能將參考系結到任何其他變數。看
#include <iostream>
#include <type_traits>
int main() {
int a = 0;
int& ref = a;
std::cout << (
std::is_reference<decltype(ref)>::value ? "pay me a bonus\n" : "reformat my hard disk\n"
);
std::cout << (
std::is_reference<decltype(a)>::value ? "pay me a bonus\n" : "reformat my hard disk\n"
);
}
最后請注意,&a并且&ref必須始終相同。
uj5u.com熱心網友回復:
第一個參考實際上是說參考與物件不可分離。
...似乎仍然暗示“參考是一個物件”。
它確實意味著參考是物件的不可分離的、非一流的別名,正如您最初所說的那樣。
這些討論的困難在于“物件”的標準含義已經不同于大多數不太正式的背景關系中使用的含義。
讓我們從簡單的開始:
int a;
通常會被描述為宣告一個整數物件a,對吧?它實際上
- 宣告一個整數物件
- 將名稱系結
a到適當范圍內的該物件
現在,如果我們寫
int &b = a;
我們可以說那b 是物件,就像我們說那a是物件一樣。實際上兩者都不正確,但鑒于非正式文本已經使用后者,它并沒有更糟。
相反,我們應該說 name 與 nameb指的是同一個物件a。這與稱其為別名完全一致,但非正式或介紹性的文本如果在a任何地方都寫“……名稱所指的整數物件……”而不僅僅是“整數a”,就會顯得很麻煩。
至于在記憶體中占用空間......這取決于。如果我在單個函式中為單個物件引入 100 個別名,如果編譯器不只是折疊它們(當然它們可能仍會出現在除錯符號中),我會感到非常驚訝。通過省略多余的名稱,這里不會丟失任何資訊。
如果我通過參考非行內函式來傳遞引數,則正在傳遞一些實際資訊,并且該資訊必須存盤在某處。
uj5u.com熱心網友回復:
參考實際上“是”什么并沒有多大意義:你可以說它是被參考的物件,或者它是它的別名,這些說法在某種意義上都是正確的。
int main()
{
int a(0);
int& ref(a);
ref = 1; // Will actually affect the value of a
return 0;
}
讓我們逐行瀏覽這個程式。
int a(0);在堆疊上分配一些記憶體(通常為 4 個位元組)以保存整數。int& ref(a);不一定分配記憶體,它實際上是否會是特定于編譯器的。從這個意義上說,ref它本身不是一個物件:它只是一個別名,另一個名字,fora。這就是第二個參考“參考不是物件”的意思。(請注意,有時,例如在編譯時無法知道參考的物件時,參考必須為物件的地址保留額外的空間。在這些情況下,參考只是指標的語法糖。)ref = 1;將 的值設定a為 1。從這個意義上說,您可以將其ref視為與 完全相同的物件a。任何“對”參考的操作實際上都會對被參考的物件進行操作。這就是第一句“它是物件”的意思。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/446150.html
下一篇:在C中取消參考NULL指標
