雖然一直知道this指標,但一直沒有底層分析過,本節就分析一下c++中的this指標,徹底理解它的本質!!!
1、c語言中的結構體傳參
c語言中結構體傳參時建議使用指標,可以少了大量的記憶體複製
分析下面的c**
#include struct student
;int plus(struct student* s)
int main()
; int r = plus(&s);
printf("%d\n", r);//6
return 0;
}
①指標傳參時是將結構體變數位址壓棧,通過位址偏移直接獲得該變數的各個成員
②而非指標傳參,會有大量的記憶體拷貝,先提公升堆疊,再將引數的值拷進去
2、c++中的this指標
c++引入封裝的概念,可以將函式封裝到結構體內部。
編譯器將當前結構體變數的位址使用ecx暫存器作為引數傳入成員函式,
當前結構體變數在使用成員函式時不需要額外傳入當前結構體變數的位址。
pp
#include struct student
};int main()
; int r = s.plus();
printf("%d\n", r);//6
return 0;
}
①首先編譯器會將物件的位址傳入ecx暫存器,再呼叫函式
②在函式前言部分會將ecx的值取出放到this指標中,後面即可直接使用
上面截圖在vs2015中直接寫的是this,在vc++6.0中顯示的是ebp-4或許更好理解一點,其實就是該函式乙個區域性的空間(變數),用來儲存呼叫者的位址,當呼叫時通過ecx暫存器(通常)將呼叫者的位址傳入該空間,以便後續操作,因此this也不會占用結構體的大小,this指標的作用域,生命週期一切都特別清晰了(純屬個人分析,只可參考)
所以上面的**可以增加下面函式
void init(int a, int b, int c)
plus函式也可修改
int plus(student* const pthis)
return pthis->a + pthis->b + pthis->c;
}
this指標相當於指標常量,不可運算,this完全可以被取代,而增加this的目的就是為了方便,也是c++設計的初衷。
當在成員函式中又呼叫其他成員函式:
通過以上分析,也可以理解靜態成員函式不隱含this指標的原因,那麼有人會問靜態成員函式也可以用物件呼叫啊,我們可以看看
通過物件呼叫靜態成員函式時,底層實際看不到那個物件,還直接類名::函式名()形式,也沒有儲存當前物件位址的行為。
關於靜態成員函式參見另一篇文章:類的靜態成員變數、靜態成員函式
指標 引用 傳值 傳址
個人總結 首先定義 struct binarytreenode 定義變數 1 binarytreenode ptreenode 2 binarytreenode n ptreenode 3 binarytreenode k 4 binarytreenode m k 引用變數必須初始化 定義 位址也稱...
C 傳值 傳址 傳指標 傳引用
相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資料傳遞...
傳值和傳址
let dadproto let sonproto dadproto sonproto.name 李四 console.log sonproto name 李四 age 20 console.log dadproto name 李四 age 20簡單資料型別 傳值 let a 10 let b a ...