c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...
提到C語言,我們知道C語言和其他高級語言的最大的區別就是C語言是要操作內存的!
我們需要知道——變量,其實是內存地址的一個抽像名字罷了。在靜態編譯的程序中,所有的變量名都會在編譯時被轉成內存地址。機器是不知道我們取的名字的,只知道地址。
內存的使用是程序設計中需要考慮的重要因素之一,這不僅由于系統內存是有限的(尤其在嵌入式系統中),而且內存分配也會直接影響到程序的效率。因此,我們要對C語言中的內存管理,有個系統的了解。
在C語言中,定義了4個內存區間:代碼區;全局變量和靜態變量區;局部變量區即棧區;動態存儲區,即堆區;具體如下:
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似于數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。
3、全局區(靜態區)(static)—全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的 另一塊區域。 - 程序結束后由系統釋放。
4、常量區 —常量字符串就是放在這里的。 程序結束后由系統釋放
5、程序代碼區—存放函數體的二進制代碼。
我們來看張圖:
首先我們要知道,源代碼編譯成程序,程序是放在硬盤上的,而非內存里!只有執行時才會被調用到內存中!
我們來看看程序結構,ELF是是Linux的主要可執行文件格式。ELF文件由4部分組成,分別是ELF頭(ELF header)、程序頭表(Program header table)、節(Section)和節頭表(Section header table)。具體如下:
1、Program header描述的是一個段在文件中的位置、大小以及它被放進內存后所在的位置和大小。即要加載的信息;
2、Sections保存著object 文件的信息,從連接角度看:包括指令,數據,符號表,重定位信息等等。在圖中,我們可以看到Sections中包括:
(1)? .text?? 文本結 存放指令;
(2)? .rodata?? 數據結? readonly;
(3)??.data? 數據結?可讀可寫;
3、Section頭表(section header table)包含了描述文件sections的信息。每個section在這個表中有一個入口;每個入口給出了該section的名字,大小,等等信息。相當于 索引!
而程序被加載到內存里面,又是如何分布的呢?我們看看上圖中:
1、正文和初始化的數據和未初始化的數據就是我們所說的數據段,正文即代碼段;
2、正文段上面是常量區,常量區上面是全局變量和靜態變量區,二者占據的就是初始化的數據和未初始化的數據那部分;
3、再上面就是堆,動態存儲區,這里是上增長;
4、堆上面是棧,存放的是局部變量,就是局部變量所在代碼塊執行完畢后,這塊內存會被釋放,這里棧區是下增長;
5、命令行參數就是$0 $1之類的,環境變量什么的前面的文章已經講過,有興趣的可以去看看。
我們知道,內存分為動態內存和靜態內存,我們先講靜態內存。
總結
以上是生活随笔為你收集整理的c语言和其他高级语言一样也要经过编译,C语言和其他高级语言的最大的区别是什么?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 这可能是现实版程序员!
- 下一篇: 2.4g和5g要不要合并_请问千兆路由器