方法呼叫時的記憶體分配

2021-10-09 00:12:50 字數 871 閱讀 3702

遵循的呼叫約定:_cdecl

支援jvm進行方法呼叫和方法執行的資料結構。棧幀儲存了方法的區域性變數表,運算元棧,動態連線和方法返回位址等資訊。每進行一次方法呼叫,便會為該方法建立乙個棧幀,當方法呼叫執行完成後,棧幀便會銷毀,因此方法內的區域性變數都不復存在。

當進行方法呼叫時,首先判斷是否需要傳參,如果需要,則將引數按從右到左的方式入棧,存到棧頂(copy值,存到不同的記憶體單元)。當呼叫方法執行時,從呼叫者的棧頂獲取引數值進行運算。

值傳遞:當基本資料型別作為引數傳遞時,傳遞的是值的copy。無論怎麼改變copy都無法引起原值的改變

引用傳遞:當引用資料型別作為引數傳遞時,傳遞的是物件在堆記憶體的位址(其實也是值呼叫,只不過引用的值是物件的記憶體位址而已)。在方法中通過該引數可以對堆記憶體中的物件進行修改(string型別除外)

案例:

public class hellomethod 

public static void main(string args)

}

列印:

s2 = aaa ,i1 = 1,sb = abc加上abc
分析:

對於int型別,為值傳遞,故無法改變原值。

對於string型別,由於"bcd"儲存在字串常量池中,故當呼叫方法時,是在方法區中新開闢一塊記憶體用於儲存"bcd",然後將"bcd"的記憶體位址賦值給s2的copy,但s2指向的仍然是"aaa"在方法區中的位址。

當傳遞string型別或基本資料型別時,無法在方法內部實現對原值的更改。

當傳遞引用資料型別(string型別除外)時,可以在方法內部對堆記憶體中物件的屬性進行更改。

當傳遞引用資料型別時,無法在方法內部使原引用指向乙個新的物件(即不能改變原值)。

vector 容器使用時應該注意的記憶體分配問題

本文說明了vector 容器使用時應該注意的記憶體分配問題,原理說的比較詳細,對於初學者比較適用。本文描述的是一種很常見的情況 當你在某個快取中儲存資料時,常常需要在執行時調整該快取的大小,以便能容納更多的資料。本文將討論如何使用 stl 的 vector 進行記憶體的再分配。這裡描述的是一種很常見...

java的記憶體分配方法

記憶體分配方法主要可以分為 堆 heap 靜態區域 由static修飾 棧 stack 常量池 其中,堆和常量池主要存放 右邊的 值 而棧和靜態區域則主要存放 左邊的變數 名 或者引用 名 舉幾個栗子 1 string str abc static int a 10 str stack 因為是 變數...

C 通過呼叫函式分配記憶體

1 以返回值方式返回 把動態分配的儲存位置位址,賦值給指標型別返回值 不同於被呼叫函式的自動變數位址 2 以形參形式返回 二級指標型別做形參 1 include 2 include 3 4 void fun int p 7 8 int main 段錯誤 1 include 2 include 3 4...