日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

执行时的C程序

發(fā)布時(shí)間:2025/4/14 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 执行时的C程序 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)據(jù)和代碼

編程語(yǔ)言理論經(jīng)典對(duì)立之中的一個(gè)就是代碼和數(shù)據(jù)的差別。有些語(yǔ)言如LISP把兩者視為一體,其它語(yǔ)言如C語(yǔ)言則維持兩者的差別。編譯絕大部分工作都跟翻譯代碼有關(guān),必要的數(shù)據(jù)存儲(chǔ)管理的絕不部分都在執(zhí)行時(shí)進(jìn)行。

學(xué)習(xí)執(zhí)行時(shí)能夠有三個(gè)優(yōu)點(diǎn),有助于優(yōu)化代碼。獲得最佳效率,有助于理解更高級(jí)的材料。陷入麻煩的時(shí)候。能夠更easy的分析問(wèn)題。

段(Segments)

ELF:(原意為Extensibla Linker Format,可擴(kuò)展鏈接器格式,如今代表Executable and Linking Format,可執(zhí)行文件和鏈接格式),存在于絕大多SVr4實(shí)現(xiàn)。
COFF:(Common Ojbect-File Format,普通目標(biāo)文件格式)。存在于其它系統(tǒng)中。

上述兩種不同的格式有一個(gè)共同的概念,段。段的概念和非常多都相關(guān),單就目標(biāo)文件而言,段就是指二進(jìn)制文件里簡(jiǎn)單的區(qū)域,里面保存了和某種特定類(lèi)型(如符號(hào)表?xiàng)l目)相關(guān)的信息。

術(shù)語(yǔ)Section也被廣泛使用。section是ELF文件里的最小組織單位。一個(gè)段一般包含幾個(gè)section。

上述段的概念是UNIX中的。和Intel X86架構(gòu)的段全然沒(méi)有關(guān)系。UNIX中段就表示一個(gè)二進(jìn)制文件的內(nèi)容塊,intel X86中段表示一種設(shè)計(jì)的結(jié)果,在這樣的設(shè)計(jì)中,地址空間并非一個(gè)總體,而是分成64k大小的區(qū)域,稱(chēng)之為段,這樣的設(shè)計(jì)也是情非得已,為了向下兼容以前的芯片。

a.out的結(jié)構(gòu)

下圖顯示了編譯器和連接器分別在這些段中寫(xiě)入了什么東西

BSS段是“Block Started by Symbol(由符號(hào)開(kāi)始的塊)”的縮寫(xiě)。它是舊式IBM704匯編程序的一個(gè)偽指令,UNIX借用了這個(gè)名字。至今仍然沿用。有些人喜歡把它記作“Better Save Space(更有效的節(jié)省空間)”,由于BSS段僅僅保存沒(méi)有值得變量,所以其實(shí)并不須要保存這些變量的映象。執(zhí)行時(shí)所須要的BSS段的大小記錄在目標(biāo)文件里。但BSS段不像其它段。它并不占用目標(biāo)文件的不論什么空間

能夠使用size命令和nm程序來(lái)查看程序各個(gè)部分的大小

操作系統(tǒng)之于a.out

為什么要用段來(lái)組織,由于段能夠方便的映射到鏈接器。在執(zhí)行時(shí)能夠直接加載。加載器僅僅須要提取文件里每一個(gè)段的映像。段在正在執(zhí)行的程序中是一塊內(nèi)存區(qū)域,每一個(gè)區(qū)域有特定的目的。


文本段包含程序的指令
數(shù)據(jù)段包含經(jīng)過(guò)初始化的全局變量和靜態(tài)變量以及它們的值,BSS段的大小從可執(zhí)行文件里得到。然后鏈接得到這個(gè)大小的內(nèi)存塊。緊跟數(shù)據(jù)塊之后,這塊內(nèi)存進(jìn)入程序后所有清零。

C語(yǔ)言執(zhí)行時(shí)系統(tǒng)之于a.out

執(zhí)行時(shí)數(shù)據(jù)結(jié)構(gòu)包含,堆棧、活動(dòng)記錄、數(shù)據(jù)和堆等

  • 堆棧段:主要有三個(gè)用途。和函數(shù)以及表達(dá)式有關(guān)。

    除了遞歸調(diào)用,堆棧并非必須的。在大多數(shù)CPU中,堆棧是向下增長(zhǎng)的,也就是朝著低地址方向生長(zhǎng)。

    • 為函數(shù)內(nèi)部的局部變量提供存儲(chǔ)空間
    • 函數(shù)調(diào)用過(guò)程中,保持一些維護(hù)性信息,稱(chēng)為堆棧結(jié)構(gòu)或者過(guò)程活動(dòng)記錄
    • 暫存區(qū),非常長(zhǎng)的算數(shù)表達(dá)式

和C++不同。C執(zhí)行時(shí)函數(shù)個(gè)個(gè)短小精悍,使得C非常高效
C語(yǔ)言不同意在函數(shù)中定義函數(shù),也就是函數(shù)不能嵌套定義。

setjmp和longjmp

以上兩個(gè)命令是C語(yǔ)言獨(dú)有的,通過(guò)操縱過(guò)程活動(dòng)記錄實(shí)現(xiàn)的。

  • setjmp(jmp_buf j)必須首先被調(diào)用。它表示使用變量j記錄如今的位置,函數(shù)返回0;
  • longjmp(jmp_buf j,int i)能夠接著被調(diào)用。它表示回到j(luò)所記錄的位置,讓他看上去像剛從setjmp函數(shù)返回一樣??墒呛瘮?shù)返回i。使代碼知道它實(shí)際上是通過(guò)longjmp返回的。

  • 當(dāng)使用longjmp時(shí)。j的內(nèi)容被銷(xiāo)毀
    • setjmp保存了一份程序計(jì)數(shù)器和當(dāng)前的棧頂指針,也能夠保存一些初始值,longjmp恢復(fù)這些初始值。
    • 和goto不同,第一,goto不能跳出C語(yǔ)言的函數(shù);第二。longjmp僅僅能回到以前到過(guò)的地方。
  • 須要注意的是。保證局部變量在longjmp過(guò)程中一直保持它的值得唯一可靠辦法就是把它聲明為volatile。
  • 兩者組合最大用途是錯(cuò)誤恢復(fù)。僅僅要還沒(méi)從函數(shù)返回,一旦發(fā)現(xiàn)一個(gè)不可恢復(fù)的錯(cuò)誤,就能夠把控制流轉(zhuǎn)移到主輸入循環(huán)。能夠用它來(lái)從一串非常深的代碼中馬上返回,提防潛在的危急代碼。

    眼下C++已經(jīng)支持了異常系統(tǒng)

switch(setjmp(jbuf)) {case 0:apple = *suspicious;break;case 1:printf("suspicious is a bad pointer\n");break;default:die("unexpected value returned bt setjmp"); }
  • 和goto一樣。不是必要的情況下不要使用它們。

UNIX和MS-DOS的堆棧段

  • 在UNIX中,當(dāng)進(jìn)程須要很多其它空間的時(shí)候,堆棧會(huì)自己主動(dòng)生長(zhǎng)。
  • DOS中,在建立可執(zhí)行文件時(shí),堆棧大小必須同一時(shí)候確定,并且它不能在執(zhí)行時(shí)增長(zhǎng)。Stack overflow是常見(jiàn)的堆棧溢出錯(cuò)誤。

實(shí)用的C語(yǔ)言工具


Reference

C專(zhuān)家編程

轉(zhuǎn)載于:https://www.cnblogs.com/brucemengbm/p/7268517.html

總結(jié)

以上是生活随笔為你收集整理的执行时的C程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。