1、c++ primer提到:引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。
引用的定義必須伴隨初始化,而且一旦定義了引用,就無法令其再繫結到另外的物件,之後每次使用這個引用都是訪問它最初繫結的那個物件。
2、何為物件?
對於物件導向來說,物件就是類的例項,是抽象化的資料本身。
更廣義的來說,乙個int型變數可以是物件,乙個指標也可以是物件,但乙個引用卻又不是物件。可以理解:在語言層面上,占用記憶體的變數都可以稱之為物件。
3、引用佔記憶體嗎?
在語言層面上:不佔記憶體!
不信看下面的簡單程式:
void function()
4、窺視底層呢?輸出:
0x7ffcb64d705c
0x7ffcb64d705c
再來看一段**:
彙編**:int
function()
pushq %rbp
movq %rsp, %rbp
//拷貝棧指標
首先在棧的%rbp-20的地方分配了乙個4位元組的空間儲存變數x=0;
leaq -20(%rbp), %rax
movq %rax, -8(%rbp)
把x的位址儲存到%rbp-8的棧空間處,int* ptr = &x;
leaq -20(%rbp), %rax
movq %rax, -16(%rbp)
把x的位址儲存到%rbp-16的棧空間處, int& r = x;
movq -16(%rbp), %rax
movl $1, (%rax)
將%rbp-16棧空間處的值改寫成1, r = 1;
movq -16(%rbp), %rax
movl (%rax), %eax
popq %rbp
ret
將%rbp-16棧空間處的值返回, return r;
思路很清晰了。建立指標和建立引用的彙編**幾乎完全一樣,在棧上分配空間,儲存變數x的位址,所有對引用變數r的操作實際都是通過這個位址在操作x。
和指標有區別嗎?沒有。
占用記憶體嗎?從底層來看,確實占用了記憶體。
5、小結
本質上,引用和指標沒有區別。只不過在語言層面上,c++設計者將通過指標來操作引用的實現細節隱藏了。不過,我們依然可以肯定:
(1)定義乙個引用就是定義乙個指標,這個指標儲存引用物件的位址,且指標型別為const,不可以再指向其他物件;
(2)每次對引用變數的使用,實際都伴隨著解引用,知識我們看不到符號*;
c 中「引用」的底層實現原理詳解
c 中 引用 的底層實現原理詳解 c c lws123253的部落格 csdn部落格 目錄 初學c 中的 引用 這一概念的時候,很多人都是懵的,大家大概都會產生這樣的疑問?什麼是引用?引用占用記憶體嗎?於是,為了驗證你的猜想,你可能會寫出下面這樣的 來驗證 includeusing namespac...
c 引用極其底層實現
一 c 中引用的語法是這樣的 int x 100 int x x 它的意思就是是給變數x起了乙個別名,在以後的 中,x其實就是x,這兩個是等價的。舉個例子,在 唐伯虎點秋香 中,唐伯虎叫做華安,又叫做9527,其實這三個名字都是同乙個人,引用就是這個意思。注意事項 引用初始化的時候一定要繫結乙個變數...
C 中的引用(記錄 理解)
type name var int main 注意 普通引用在宣告時,必須用其他的變數進行初始化 不能用常量進行初始化 swap函式的實現對比 void swap int a,int b swap a,b void swap int pa,int pb swap a,b 注意 引用作為函式引數宣告時...