C語言與內存的關係

1、C語言爲何須要內存

1.C語言的目的

  計算機程序目的是程序的運行,運行的目的是爲了獲得必定的結果或者是在運行的過程當中執行了某項動做。程序 = 代碼(加工數據的動做) + 數據html

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

  因此,這就回答了爲何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#  則直接回收內存,基本不用對內存進行操做了。code

 

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

1.概念解析

位=1bit,字節=8bithtm

內存位寬、半字和字得看處理器是多少位的,好比說處理器是32bit的,則內存位寬是32bit,字=32bit ,半字是字的一半,就是16bit 了。在MSP430上,因爲它是16bit處理器,因此它的字是16bit的。80c51單片機是8位的,因此位寬是8位的blog

 

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位的尋址能力更強,固然要求的硬件配置也更高!

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

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

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

如給某個絕對地址賦值爲12   :            *(unsigned int *)0x1000 = 12;    //系統會分配0x1000、0x100一、0x100二、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

 

4、C語言如何操做內存

結合上面描述內存對齊的時候能夠發現,C語言是經過數據類型去操做內存的。

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

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

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

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

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

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

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

5、內存管理之棧和堆

1.棧

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

2.堆

相關文章
相關標籤/搜索