理解C 中引用的底層實現

2021-08-11 05:49:11 字數 1898 閱讀 4395

1、c++ primer提到:引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。

引用的定義必須伴隨初始化,而且一旦定義了引用,就無法令其再繫結到另外的物件,之後每次使用這個引用都是訪問它最初繫結的那個物件。

2、何為物件?

對於物件導向來說,物件就是類的例項,是抽象化的資料本身。

更廣義的來說,乙個int型變數可以是物件,乙個指標也可以是物件,但乙個引用卻又不是物件。可以理解:在語言層面上,占用記憶體的變數都可以稱之為物件。

3、引用佔記憶體嗎?

在語言層面上:不佔記憶體!

不信看下面的簡單程式:

void function()

輸出:

0x7ffcb64d705c

0x7ffcb64d705c

4、窺視底層呢?

再來看一段**:

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 注意 引用作為函式引數宣告時...