C 之CLR記憶體原理初探

2022-09-26 08:39:08 字數 852 閱讀 8380

本文初步講述了c#的clr記憶體原理。這裡所關注的記憶體裡面說沒有暫存器的,所以我們關注的只有託管堆(h程式設計客棧eap),棧(stack), 字串常量池(其中string是乙個很特殊的物件)

首先我們看兩個方法:

void m1()

void m2(string name2)

這裡我們有乙個m1的方法,初始化乙個name區域性變數,然後呼叫m2..............

如下圖所示先來看看的執行程式設計客棧原理:

首先在乙個最基本的方法中,應包含一些「prologue"**(不用我們管,編譯自動生成的),負責在方法開始做它的工作之前進行初始化,還應有一些"epilogue"**,負責在方法完成的時候進行清理,然後才返**用者。m1開始是,它的"prologue"****程棧上分配區域性變數name的記憶體,它被負值了tom,tom這個字串在字串常量池。m1呼叫m2,將區域性變數name作為乙個實參來傳遞。這造成name區域性變數中的位址被壓入棧。在m2方法內部,將使用名為name2引數變數來標識棧位置。另外,呼叫乙個方法時,還會將乙個「返回位址」壓入棧。被呼叫的方法在結束以後應該返回到這個位置(呼叫的位置)。

接著再來看看下圖所示程式設計客棧m2的執行原理:

m2的"prologue"**為length和rate進行記憶體的分配,然後m2**開始執行**。最終,m2抵達它的return語句,造成cpu的指令指標被設定成棧中的返回位址(就說我們圖中的);

注:這裡特別要提一下的說name2,name2在呼叫的時候已經變成引數壓入了棧,所以這裡只是對這裡的位址進行重新指向,string的記憶體玩法可以看字串常量池的相關介紹。

本文標題: c#之clr記憶體原理初探

本文位址: /ruanjian/csharp/111615.html

CSS Sprite初探之原理 使用

css sprite簡介 利用css sprites能很好地減少了網頁的http請求次數,從而大大的提高了頁面的效能,節省時間和頻寬。css sprites在國內很多人叫css精靈,是一種網頁應用處理方式。它允許你將乙個頁面涉及到的所有零星都包含到一張大圖中去,這樣一來,當訪問該頁面時,載入的就不會...

C 物件記憶體模型初探

週末看資料的時候,看到虛繼承和虛函式 兩者完全不是一碼事,正在寫乙個簡單的總結 進一步看到c 的類物件的記憶體模型,網上已有很多文章,自己也記錄一下。研究問題從簡單入手,一步步深入。我們先來看乙個最簡單的模式 class a 用測試程式可以發現,a的物件的大小是4位元組,也就是a int型別 的大小...

C 模板之Vector與STL初探

stl原始碼初步接觸 stl standard template library,直譯過來是 標準模板庫,是惠普實驗室開發的一系列軟體的統稱。從根本上說,stl是一些 容器 的集合,這些 容器 有list,vector,set,map等,stl也是演算法和其他一些元件的集合。這裡的 容器 和演算法的...