欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

C-05\函數(shù)的底層原理

一、程序運(yùn)行時(shí)內(nèi)存四大區(qū)

wres(內(nèi)存屬性):

茶陵網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)建站!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)建站從2013年開(kāi)始到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)建站。

  • w:write(可寫)
  • r:read(可讀)
  • e:execute(可執(zhí)行)
  • s:share(可共享)

任何操作系統(tǒng)(windows、liunx、安卓、ios等)上的程序在運(yùn)行時(shí),都有內(nèi)存四大區(qū),分別為:代碼區(qū)(code),數(shù)據(jù)區(qū)(data),棧區(qū)(stack),堆區(qū)(heap)

代碼區(qū)(code):存放二進(jìn)制可執(zhí)行代碼,內(nèi)存屬性為re

數(shù)據(jù)區(qū)(data):存放全局變量,靜態(tài)變量和常量(C語(yǔ)言)

  • init:已初始化數(shù)據(jù)區(qū):存放已初始化的全局變量和靜態(tài)變量,還有常量

    • rw:可讀寫數(shù)據(jù)區(qū)(存放已賦初值的全局變量和靜態(tài)變量)
    • r:只讀數(shù)據(jù)區(qū)(存放常量)
  • uninit:未初始化數(shù)據(jù)區(qū):存放未初始化的全局變量和靜態(tài)變量,內(nèi)存屬性為rw

棧區(qū)(stack):先進(jìn)后出,后進(jìn)先出(類似彈夾),內(nèi)存屬性為rw。經(jīng)常被翻譯為堆棧,其實(shí)就是棧區(qū),這是老一輩翻譯國(guó)外技術(shù)書籍時(shí)候的一個(gè)習(xí)慣,喜歡成對(duì)成對(duì)的用詞,而中國(guó)傳統(tǒng)習(xí)慣是后者定性,例:禮無(wú)可恕,情有可原。那么你就被放了,沒(méi)事。如果說(shuō) 情有可原,禮無(wú)可恕,那么你就攤上大事了。再例:牛奶,是奶;奶牛,是牛。所以指針數(shù)組是數(shù)組,數(shù)組指針是指針

堆區(qū)(heap):內(nèi)存屬性為rw

二、函數(shù)的底層原理

每個(gè)函數(shù)都有一個(gè)屬于自己的??臻g,用來(lái)記錄函數(shù)的必要信息

  1. 按調(diào)用約定傳參
    • 參數(shù)的傳遞方向(是從右向左還是從左向右傳參)
    • 參數(shù)的存儲(chǔ)媒介(參數(shù)放寄存器還是棧區(qū)或者其他)
    • 誰(shuí)負(fù)責(zé)釋放(平衡)參數(shù)空間
    • 返回值的處理
__cdecl __stdcall __fastcall
解釋 C調(diào)用約定,美國(guó)國(guó)標(biāo)標(biāo)準(zhǔn),默認(rèn)調(diào)用約定 標(biāo)準(zhǔn)約定,微軟的規(guī)定,微軟操作系統(tǒng)使用的調(diào)用規(guī)定,Windows API的標(biāo)準(zhǔn)調(diào)用約定 快速約定,只有微軟某一系列編譯器獨(dú)有的,未標(biāo)準(zhǔn)化,不同編譯器可能沒(méi)有或者實(shí)現(xiàn)不一致
參數(shù)傳遞方式 從右往左,通過(guò)棧傳遞 從右往左,通過(guò)棧傳遞 左數(shù)前兩個(gè)參數(shù)放在ecx、edx寄存器中,其余從右往左通過(guò)棧傳遞
誰(shuí)清理?xiàng)I蠀?shù) 調(diào)用者(caller) 被調(diào)者(callee) 被調(diào)者(callee)
編譯器參數(shù) /Gd /Gz /Gr
可變參 支持 不支持 不支持
  1. 在棧頂保存返回地址

  2. 保存調(diào)用方的棧信息(調(diào)用方的棧底位置)

  3. 更新棧位置(在處理器里)到被調(diào)用方的棧底處

  4. 在棧內(nèi)開(kāi)辟局部變量的空間

    ? 編譯器此時(shí)會(huì)統(tǒng)計(jì)局部變量的大小(占多大空間),然后以此開(kāi)辟足夠空間

    ? 調(diào)試版開(kāi)辟的空間大于等于實(shí)際局部變量的大小,發(fā)行版(優(yōu)化版)開(kāi)辟的空間小于等于實(shí)際局部變量的大小

     使用`/O1`和`/O2`編譯選項(xiàng)會(huì)根據(jù)變量使用情況,會(huì)分配小于等于變量大小的空間,例:
    
    // 第一種優(yōu)化情況
    // 如果開(kāi)了優(yōu)化,編譯器不會(huì)給局部變量nNum開(kāi)辟空間
    // 而是直接使用 printf("%d",3);
    int nNum = 3;
    printf("%d",nNum)
        
    // 第二種優(yōu)化情況
    // 根據(jù)情況使用寄存器存儲(chǔ)變量
    

    ? 編譯選項(xiàng)有/Zi+/Od(調(diào)試版且不優(yōu)化),則填充局部變量空間為0xcc

  5. 保存寄存器環(huán)境

  6. 執(zhí)行函數(shù)體

  7. 恢復(fù)寄存器環(huán)境

  8. 釋放局部變量空間

  9. 恢復(fù)棧信息到調(diào)用方

  10. 如果是 __cdecl,先取出返回地址,并按此返回地址作流程更新,抵達(dá)新地址后,由調(diào)用方清理參數(shù);

    如果是 __fastcall,__stdcall,先取出返回地址,并清理參數(shù),然后按返回地址作流程更新

三、函數(shù)的遞歸調(diào)用

遞歸善于處理非線性問(wèn)題,不善于處理線性問(wèn)題,循環(huán)善于解決線性問(wèn)題

  • 線性問(wèn)題:有唯一的前驅(qū)且有唯一的后繼的問(wèn)題,例:n的累加
  • 非線性問(wèn)題:A問(wèn)題產(chǎn)生分支,產(chǎn)生了B1問(wèn)題和B2問(wèn)題,B1B2合并產(chǎn)生C問(wèn)題,C問(wèn)題又回歸到A問(wèn)題

四、函數(shù)注釋規(guī)范

  1. 函數(shù)功能
  2. 各個(gè)參數(shù)意義
  3. 返回值意義(void寫無(wú),不能不寫)
  4. 備注或其他信息
  5. 版本和修改日期,修改人(看公司需要)

五、附加知識(shí)

  • Alt+F8(VC++6.0代碼對(duì)齊快捷鍵)
  • 函數(shù)可以通過(guò)提供.obj文件或動(dòng)態(tài)鏈接庫(kù)給別人使用
  • 裸函數(shù)不屬于調(diào)用約定,是一個(gè)關(guān)鍵字,讓編譯器不為此函數(shù)生成任何代碼的關(guān)鍵字
  • Fibonacci數(shù)列可求黃金分割比例,越后面的前一項(xiàng)和后一項(xiàng)的比值越接近0.618
  • 函數(shù)名前加_表示內(nèi)層函數(shù)

新聞標(biāo)題:C-05\函數(shù)的底層原理
文章來(lái)源:http://chinadenli.net/article44/dsoijhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站營(yíng)銷、網(wǎng)站收錄品牌網(wǎng)站制作、定制開(kāi)發(fā)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)