4.1.1 程式執行為什麼需要記憶體?
4.1.1.1 計算機程式執行的目的。
4.1.1.2 計算機程式執行過程
4.1.1.3 馮諾依曼結構和哈佛結構
馮諾依曼結構是:資料和**放在一起。
哈佛結構是:資料和**分開存在。
什麼是**:函式
什麼是資料:全域性變數、區域性變數。
4.1.1.4 動態記憶體dram和靜態記憶體sram。
4.1.1.5 總結:為什麼需要記憶體?
4.1.1.6 如何管理記憶體
從作業系統角度講:作業系統掌握所有的記憶體,因為記憶體很大,所以作業系統把記憶體分為1個個的頁面(一般是4kb),然後以頁面為單位來管理。頁面內用更細小的方式來以位元組為單位管理。作業系統給我們提供裡記憶體管理的一些介面,我們只需要用api即可管理記憶體。譬如在c語言中使用malloc申請 free釋放。
沒有作業系統時:在沒有作業系統時(裸機程式),程式需要直接操作記憶體。
再從語言角度來講:不同的語言提供了不同的操作記憶體的介面。例如彙編:完全沒有記憶體管理,直接使用記憶體位址;c語言中編譯器幫我們管理直接記憶體位址,我們都是通過編譯器提供的變數名等來訪問記憶體;c++語言對記憶體的使用進一步封裝,我們可以用new來建立物件(其實就是為物件分配記憶體),然後使用完了用delete來刪除物件(其實就是釋放記憶體)。如果程式設計師new了乙個物件,但是用完忘記delete就會造成這個物件占用的記憶體不能釋放,這就是記憶體洩漏。j**a/c#:這些語言不直接操作記憶體,而是通過虛擬機器來操作記憶體。這樣虛擬機器作為我們程式設計師的**,來幫我們處理記憶體的釋放工作。虛擬機會幫我們管理。但是其實他這個虛擬機器**記憶體是需要付出一定代價的。當我們程式對效能非常在乎的時候(比如作業系統核心)就會用c/c++;當我們對開發程式的速度非常在乎的時候,就會用j**a/c#等語言。
4.1.2.1 什麼是記憶體(硬體和邏輯角度)
硬體上:是乙個配件。
從邏輯角度:它可以隨機訪問,(意思是只要給乙個位址,就可以訪問這個記憶體位址)、並且可以讀寫。內存在程式設計中天然是用來存放變數的(就是因為有了記憶體,所以c語言才能定義變數,c語言中的乙個變數實際就對應記憶體中的乙個單元)。
4.1.2.2 記憶體的邏輯抽象圖
4.1.3 位和位元組
4.1.3.4 字和半字
4.1.3.4 記憶體位寬
硬體上講:硬體記憶體的實現本身是有寬度的。
邏輯上講:記憶體位寬在邏輯上是任意的,從邏輯上說不管記憶體位寬是多少,對我的操作不構成影響。但我們的操作不是純邏輯而是需要硬體去執行的,所以不能為所欲為,所以我們實際的很多的操作都是受限於硬體的特性的。
c語言學習日記(九)
上三角矩陣指主對角線以下的元素都為0的矩陣 主對角線為從矩陣的左上角至右下角的連線。本題要求編寫程式,判斷乙個給定的方陣是否上三角矩陣。輸入格式 輸入第一行給出乙個正整數t,為待測矩陣的個數。接下來給出t個矩陣的資訊 每個矩陣資訊的第一行給出乙個不超過10的正整數n。隨後n行,每行給出n個整數,其間...
C語言學習日記6
1 資料型別 1.1 基本資料型別 資料型別分2類 基本資料型別 復合型別 基本型別 char short int long float double 復合型別 陣列 結構體 共用體 類 c 1.1.1記憶體占用與sizeof運算子 資料型別就好像乙個個的模子,這個模子例項化出c語言的變數。變數儲存...
C語言學習日記4
1 指標型別 在定義指標的時候 資料型別 指標名 這個地方的資料型別,是指指標指向的變數的資料型別。必須匹配!在定義的時候可以這麼定義 int pint float pfloat char pchar double pdouble int p 理解方法,首先看到p,這個是變數名,其次,p前面有個 說...