C語言與內存的關系


一、C語言為什么需要內存

1.C語言的目的

  計算機程序目的是程序的運行,運行的目的是為了得到一定的結果或者是在運行的過程中執行了某項動作。程序 = 代碼(加工數據的動作) + 數據

  函數可以完美的解釋: 返回值是void ,說明沒有輸出結果,形參為void,說明沒有輸入數據。反之,套用即可。當然也有即輸出結果和輸入數據的,如 int add(int a,int b);

  所以,這就回答了為什么C語言需要內存這個問題了:

99.9的程序需要數據的參與,內存存儲可變數據,數據在程序中表現為全局變量和局部變量(在gcc中,常量也存儲在內存中,在單片機中,常量存儲在flash中,也就是存在代碼段中)。所以內存對於程序的有效力是本質相關的!所以說C語言程序需要內存。

2.馮諾依曼結構和哈佛結構

  馮諾依曼結構:數據和代碼放在一起;哈佛結構:數據和代碼分開。按照我此刻的思想去理解,代碼即函數,數據即局部變量+全局變量。

  在JZ2440 中運行的Linux系統上,運行應用程序時,所有的應用程序代碼和數據都在DRAM中,所以是馮諾依曼結構;在單片機(裸機)中,程序燒寫在NorFlash上,然后將程序在Flash中原地運行,程序中涉及到的數據在RAM(SRAM)中運行,這就是哈佛結構。

3.動態內存DRAM和靜態內存SRAM

 

4.內存的管理

現在的水平,還沒到管理內存的地步,我們先不研究它。但是得知道,內存有內存管理機制,為用戶提供了API接口,如C/C++中的malloc(),free(),new()等函數;java/C#  則直接回收內存,基本不用對內存進行操作了。

 

二、位、字節、半字、字的概念和內存位寬

1.概念解析

位=1bit,字節=8bit

內存位寬、半字和字得看處理器是多少位的,比如說處理器是32bit的,則內存位寬是32bit,字=32bit ,半字是字的一半,就是16bit 了。在MSP430上,由於它是16bit處理器,所以它的字是16bit的。80c51單片機是8位的,所以位寬是8位的

 

2.int應該是2位。4位的還是8位的呢?

在VC++平台上,int默認為long int類型,長度是4;在TC平台上,int默認為short int,長度為2.

3.多少位有什么意義呢?

  CPU按照其處理信息的字長可以分為:八位微處理器、十六位微處理器、三十二位微處理器以及六十四位微處理器等。CPU最大能查找多大范圍的地址叫做尋址能力,CPU的尋址能力以字節為單位,如32位尋址的CPU可以尋址2的32次方大小的地址也就是4G,這也是為什么32位的CPU最大能搭配4G內存的原因,再多的話CPU

就找不到了。我們安裝系統時所說的32bit系統和64位系統就是說的這些。64位的尋址能力更強,當然要求的硬件配置也更高!

三、內存編址和尋址、內存對齊

內存是以字節為基礎分配的。

  • 內存編址:給每個字節填上一個編號,這個編號我們常說叫作地址。如 int a;  //內存就會給變量a分配一塊4個字節的內存,&a表示首字節的地址。
  • 內存的尋址:給出編號,可以找到對應的地址,且可以分配對應的內存空間。

如給某個絕對地址賦值為12   :            *(unsigned int *)0x1000 = 12;    //系統會分配0x1000、0x1001、0x1002、0x1003地址空間為int類型

  • 內存對齊:用結構體來說明。
struct a
{
	char c;
	int b;
	long d;	
};

  

sizeof(a) = 12;

  這就是內存對齊,內存對齊了才容易找,但是為了節省空間,可以不適用內存對齊的方式。不過這種方式現在很少使用了。

  另外,int這種數據類型,由於其使用的效率高,十分對應硬件需求,甚至在使用bool(1bit)的請況下,分配了一個int內存給它(即使浪費了31bit),但是效率加快了許多。這就是增大了內存,提高了效率,換句話說,就是提高了流暢性和用戶體驗。這就是內存對齊的威力!

 

其實內存對齊還有一個重要的類型,就是數組(作為最簡單的數據結構)。與結構體的區別:1.結構體數據容易增減;2.數組要求元素相同,分配的內存確定。3.尋址不一樣,數組為a[1], 結構體需要定義結構體類型之后,定義結構體變量在用  a->b 或者 a.b

 

四、C語言如何操作內存

結合上面描述內存對齊的時候可以發現,C語言是通過數據類型去操作內存的。

那什么是數據類型呢?數據類型的本質含義是內存中所占的內存格子長度+解析方法。不同的數據類型有不同的解析方法如

int a; //內存就會給變量a分配一塊4個字節的內存,&a表示首字節的地址。

  這個解析方法為int類型,分配4個字節,存儲整型數據

float b;    //分配4個字節,存儲浮點型數據(比如,前兩個字節存整數部分,后兩個字節存小數部分..)

  這個解析方法為float類型,分配4個字節,存儲浮點型數據

double * c;    //分配4個字節,存儲指針變量。

  這個解析方法為double指針類型,分配4個字節,存儲指針變量,這個解析方法對應數據指向double類型的數據。

五、內存管理之棧和堆

1.棧

棧的功能實現代碼:http://www.cnblogs.com/simonLiang/p/6113705.html

2.堆


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM