我對於呼叫物件和基本變數型別記憶體的執行機制理解

2021-06-28 18:45:34 字數 1293 閱讀 3185

在學習php的過程中,才發現這麼乙個問題: 函式好物件的呼叫所產生的結果型別是不同的,或者說,在記憶體裡面的操作是不同的,下面是我的php的例項**:

<?php 

class classmate

///如果引數是物件,那麼傳遞的是物件的位址

function change($obj)

$myobj = new classmate();//

change($myobj);//

echo $myobj->num1.'

'.$myobj->num2."

".$myobj->num3.'

';?>

上面的結果是4,5,6;

做這個圖的目的是說明: 在程式執行的一開始,這個記憶體就自然的建立起來了,然後我的總結就是,把物件分配到堆區,把函式分配到棧區。

那麼就是說在棧區棧區傳遞給函式的是物件的位址,而不是數值,這裡是和傳遞變數是不同的,後者是傳遞的值,那麼就得來了,當在棧區的

函式裡面對物件的成員屬性進行操作是,就是直接指向堆區的物件,然後直接的具體操作,這個過程完成之後,函式結束,隨之,它在記憶體裡面

開闢的棧區也就隨之銷毀,不僅這裡,所有的函式都是這個工作機制的,從而,這樣完成了數字的修改。

但是,同時想一想,如果是函式對於基本型別的變數進行操作呢,為了說說明語言對於記憶體操作的一致性,下面第用c++寫的一段簡單**:

#include using namespace std;

int jisuan(int x, int y, int z)

int main()

說明一下:上面**執行的結果是1,2,3;這樣看起來就有點暈了,明明對變數進行修改了啊,為什麼沒有改變呢,經過學習,我才知道,也就是上面的一段話,就是當函式的引數是基本變數型別的時候,傳遞給函式的是他們的數值,這時並非位址,同樣的,在系統分配的記憶體圖可以這樣解釋,普通變數是建立在棧區的(起初的初始值就已經建立)

,當我們去呼叫函式的時候,在棧區,會建立乙個對應函式的棧區,說白了就是把abc的值賦值給分配給函式棧區的對應變數,但是,當我們呼叫函式之後,同樣的它的棧就隨之的被銷毀,自然就不會存在值得改變了,即便不銷毀,也不會改變,那麼就只剩下起初給的變數,所以,這個過程就不會改變

記憶體的機制是學習編譯原理才會了解到的,但問題是,如果我不了解並學習它,對今後的php學習可定是比較模糊的,所以,至少應該做到了解,以上僅僅是我的理解,僅供參考,忘指正。

變數和基本型別

算術型別 arithmetic type c 標準規定了每個算術型別的最小儲存空間,但允許編譯器使用更大的儲存空間。事實上,對於int型,幾乎現在所有的編譯器使用的儲存空間都比所要求的大 也表明,在編寫程式時不能對這些型別的大小做任何假設 c 算術型別最小儲存空間規定如下 注 要特別注意int型,並...

變數和基本型別

c 程式通常由許多檔案組成,為了讓多個檔案訪問相同的變數,c 區分了宣告和定義。變數的定義 definition 用於為變數分配儲存空間,還可以為變數指定初始值。在乙個程式中,變數有且僅有乙個定義。c 支援兩種初始化變數的形式 複製初始化 copy initialization 和直接初始化 dir...

變數和基本型別

一 資料型別 c 主要有bool,char,short,int,long,long long float,double,long double,wchar t 寬字元 char16 t char32 t unicode字元 每個型別對應不同的位元組尺寸,以上型別都是有符號的,加上關鍵字unsigne...