国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

函數(shù)調(diào)用的三種約定,你都清楚嗎

開(kāi)發(fā) 后端
三種調(diào)用方式的區(qū)別相信大家應(yīng)該有些了解,這篇文章主要從實(shí)例和匯編的角度闡述這些區(qū)別的表現(xiàn)形態(tài),使其對(duì)它們的區(qū)別認(rèn)識(shí)從理論向?qū)嶋H過(guò)渡。

 __cdecl、__stdcall、__fastcall是C/C++里中經(jīng)常見(jiàn)到的三種函數(shù)調(diào)用方式。其中__cdecl是C/C++默認(rèn)的調(diào)用方式,__stdcall是windows API函數(shù)的調(diào)用方式,只不過(guò)我們?cè)陬^文件里查看這些API的聲明的時(shí)候是用了WINAPI的宏進(jìn)行代替了,而這個(gè)宏其實(shí)就是__stdcall了。

三種調(diào)用方式的區(qū)別相信大家應(yīng)該有些了解,這篇文章主要從實(shí)例和匯編的角度闡述這些區(qū)別的表現(xiàn)形態(tài),使其對(duì)它們的區(qū)別認(rèn)識(shí)從理論向?qū)嶋H過(guò)渡。

我們知道,函數(shù)的調(diào)用過(guò)程是通過(guò)函數(shù)棧幀的不斷變化實(shí)現(xiàn)的:

函數(shù)的調(diào)用,涉及參數(shù)傳遞,返回值傳遞,調(diào)用后返回,這都是通過(guò)棧的變化來(lái)實(shí)現(xiàn)的,對(duì)于三種調(diào)用約定而言:

__cdecl:

C/C++默認(rèn)方式,參數(shù)從右向左入棧,主調(diào)函數(shù)負(fù)責(zé)棧平衡。

__stdcall:

windows API默認(rèn)方式,參數(shù)從右向左入棧,被調(diào)函數(shù)負(fù)責(zé)棧平衡。

__fastcall:

快速調(diào)用方式。所謂快速,這種方式選擇將參數(shù)優(yōu)先從寄存器傳入(ECX和EDX),剩下的參數(shù)再?gòu)挠蚁蜃髲臈魅?。因?yàn)闂J俏挥趦?nèi)存的區(qū)域,而寄存器位于CPU內(nèi),故存取方式快于內(nèi)存,故其名曰“__fastcall”。

下面從實(shí)例來(lái)認(rèn)識(shí)一下這三種調(diào)用約定。先來(lái)看一個(gè)簡(jiǎn)單的不能再簡(jiǎn)單的程序了:

 

三個(gè)函數(shù)的內(nèi)容都是一樣的,不同的是使用了三種調(diào)用的方式。我們先來(lái)看看在main函數(shù)調(diào)用三個(gè)函數(shù)的時(shí)候的匯編代碼: 

按照上面說(shuō)的那樣,__cdecl按照參數(shù)從右向左的方式進(jìn)入棧區(qū),注意Fun1()和Fun3()的區(qū)別,F(xiàn)un1()在call Fun1()之后執(zhí)行了add esp,8。這一操作正是我們前面所說(shuō)的進(jìn)行棧的平衡。調(diào)用函數(shù)之前連續(xù)進(jìn)行了兩次push操作將函數(shù)所需的實(shí)參5和2先后壓入了棧區(qū),調(diào)用完成后,我們需要恢復(fù)調(diào)用前的狀態(tài),則需調(diào)整棧頂指針esp的位置,這一工作由誰(shuí)來(lái)完成就決定了兩種函數(shù)調(diào)用方式__cdecl(主調(diào)函數(shù)完成)和__stdcall(被調(diào)函數(shù)完成)的區(qū)別。上圖我們看到了__cdecl中由主調(diào)函數(shù)完成了,那么__stdcall呢,在被調(diào)函數(shù)Fun3()中,轉(zhuǎn)向被調(diào)函數(shù)結(jié)尾處的代碼,我們看到了這一句:

那么Fun1()結(jié)尾處又是如何呢?

看到了吧,這個(gè)ret指令后面跟沒(méi)跟值就決定了函數(shù)返回是棧指針ESP需要增加的量。這樣,不需要主調(diào)函數(shù)再調(diào)用add指令為ESP操作平衡棧區(qū),節(jié)約了程序的開(kāi)銷,一條指令開(kāi)銷小,如果十萬(wàn)百萬(wàn)個(gè)這樣的調(diào)用,這個(gè)開(kāi)銷就明顯了。

說(shuō)完了__cdecl和__stdcall,再來(lái)看看__fastcall,如前面圖看到的調(diào)用時(shí)并未使用push指令向棧里傳參數(shù),而是使用了

  mov  edx, 5

  mov  ecx, 2

兩條指令。這樣直接將參數(shù)傳入寄存器,被調(diào)函數(shù)在執(zhí)行的時(shí)候直接從寄存器取值即可,省去了從棧里取出來(lái)給寄存器,再?gòu)募拇嫫魅〕鰜?lái)放入內(nèi)存。

不過(guò),說(shuō)個(gè)題外話,ecx寄存器經(jīng)常作為計(jì)數(shù)和C++里this指針的傳遞媒介。在這種情況下,情況又是怎樣的呢,下次分析C++操作符 new 的時(shí)候再予以討論。ecx做計(jì)數(shù)器時(shí),需要將ecx中存儲(chǔ)的實(shí)參先壓入棧區(qū),計(jì)數(shù)操作完成后再pop出來(lái)。如此一來(lái),這個(gè)fastcall倒顯得不那么fast了。

當(dāng)然,上面所說(shuō)的這些操作都是由編譯器在背后為我們完成的,開(kāi)發(fā)人員無(wú)需關(guān)心這些操作,對(duì)我們是透明的。不過(guò),知其然更知其所以然方能立于不敗之地! 

 

責(zé)任編輯:龐桂玉 來(lái)源: C語(yǔ)言與C++編程
相關(guān)推薦

2019-05-08 10:50:37

交換機(jī)組網(wǎng)網(wǎng)絡(luò)

2021-09-13 13:05:05

Redis數(shù)據(jù)庫(kù)內(nèi)存

2023-02-27 23:45:09

MySQL索引存儲(chǔ)

2023-08-04 08:25:03

客戶配置Spring

2023-09-22 08:01:10

2023-09-14 23:14:57

MySQL索引

2021-02-25 23:40:26

Redis集群架構(gòu)

2023-02-02 14:24:08

物聯(lián)網(wǎng)數(shù)據(jù)分析云平臺(tái)

2011-01-18 15:35:59

jQueryJavaScriptweb

2021-10-10 12:29:27

機(jī)器人AI人工智能

2022-01-10 07:57:25

Linux 插樁Linux 系統(tǒng)

2024-11-26 07:47:41

2025-06-06 00:00:00

JavaHTTPMCP

2024-08-13 08:25:16

C#外部程序方式

2022-07-09 15:37:14

數(shù)字化轉(zhuǎn)型企業(yè)數(shù)字化

2020-09-11 06:39:29

ThreadLocal線程

2024-05-27 00:20:00

2010-02-03 15:46:15

C++函數(shù)傳遞

2016-09-18 22:47:57

分布式存儲(chǔ)GFSAFSLustre

2017-02-20 17:15:43

分布式存儲(chǔ)文件系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本成人手机在线| 99国产精品视频免费观看| 国产曰批免费观看久久久| 欧美一区二区三区小说| 无人在线观看的免费高清视频| 欧美成人亚洲| 亚洲精品720p| 免费无码不卡视频在线观看| 91精品精品| 成人欧美一区二区三区视频网页| 女人床在线观看| 蜜臀av一区二区| 日韩久久不卡| 久久男女视频| 久久久人人爽| 最新国产乱人伦偷精品免费网站| 91在线看网站| 欧美高清视频在线观看mv| 日本中文字幕久久看| 国产精品nxnn| 2019中文字幕在线观看| youjizz亚洲| 日本欧美精品在线| 成人中文在线| 亚洲在线一区二区| 精品69视频一区二区三区Q| 国产欧美一区二区三区不卡高清| 亚洲高清久久| 国产一区二区精品免费| 久久亚洲精品伦理| 女同性恋一区二区| 91日韩在线专区| 天天综合天天| 精品av在线播放| 麻豆传媒视频在线| 日韩精品在线私人| 精品视频一二| 国产高清在线不卡| 欧美另类亚洲| 永久久久久久| 久久亚洲二区三区| 激情六月婷婷| 69堂成人精品免费视频| h片在线观看视频免费免费| 亚洲视频视频在线| 欧美人体视频| 国产精品免费在线| 国产在线视频一区二区三区| 免费无码不卡视频在线观看| 亚洲伦理在线精品| 成人午夜电影在线观看| 亚洲国产精品成人va在线观看| 成人一级视频| 日韩美女毛茸茸| 日韩一级精品| 欧美日韩福利在线| 亚洲美女免费视频| 色爱综合区网| 国内精品久久久久伊人av| 影音先锋日韩精品| 草草草视频在线观看| 亚洲欧美日韩国产手机在线| 二区三区在线观看| 久久亚洲精品一区二区| 91tv官网精品成人亚洲| 爱爱爱视频网站| 国产日产欧美一区| 成人av毛片| 欧美wwwxxxx| 一区二区蜜桃| 欧洲精品一区二区三区久久| 精品久久久久国产| 僵尸再翻生在线观看免费国语| 欧洲成人免费aa| 天堂蜜桃91精品| 四虎国产成人永久精品免费| 91精品麻豆日日躁夜夜躁| 精品欧美视频| 精品日韩电影| 久久久精品天堂| 国产福利视频在线观看| 久久久久久久一| 日本色综合中文字幕| 影音先锋亚洲视频| 一区二区高清免费观看影视大全| 成人拍拍拍免费视频网站| 亚洲国产成人porn| 亚洲综合精品| 男女啪啪网站视频| 欧美精品乱人伦久久久久久| 超碰成人在线观看| 亚洲国产精品一区在线观看不卡| 一区二区日韩电影| av成人免费| 欧美日韩在线精品一区二区三区| 国产精品美女一区二区三区 | 亚洲美女在线看| 欧美成人精品午夜一区二区| 久久久久久久国产精品| shkd中文字幕久久在线观看| 久久久www成人免费精品张筱雨| 在线 亚洲欧美在线综合一区| 黄色片在线免费| 亚洲成人动漫在线播放| 四季av一区二区凹凸精品| 国产成人久久婷婷精品流白浆| 日韩欧美国产高清| 欧美一区网站| 久久久久久久久久久久久久久久久久久| 亚洲色图15p| 日韩不卡一二三区| www亚洲人| 亚洲综合自拍一区| 亚洲一区欧美一区| 99精品国产高清一区二区麻豆| 天堂а√在线中文在线| 欧美一区二区二区| 在线成人亚洲| 国产黄在线播放| 成人综合网网址| 一区二区三区精品| 欧美人体视频| 高清成人av| 久久久久久久成人| 中文字幕av一区 二区| 国产精品成人3p一区二区三区| 欧美国产综合在线| 国产香蕉精品视频一区二区三区 | 深夜爽爽视频| 91福利视频网| 亚洲日本在线a| 国产a久久精品一区二区三区| 嫩草av久久伊人妇女超级a| 久久视频这里只有精品| 91免费看片在线观看| 国产精品va视频| 一区二区三区视频在线观看免费| 久久国产精品久久国产精品| 国产婷婷色一区二区三区| 亚洲精品v亚洲精品v日韩精品| 我要看一级黄色大片| 欧美影院在线播放| 夜夜精品视频一区二区| 999久久久亚洲| 一级日本在线| 亚洲精品二区| 最近2019好看的中文字幕免费| 久久久五月婷婷| 免费成人高清在线视频theav| 一个人看的www一区| 国产一区二区不卡视频| 亚洲国产成人精品女人久久久| 大白屁股一区二区视频| 欧美a一级片| 国产91精品捆绑调教| 成人春色激情网| 制服丝袜亚洲色图| 老司机精品视频在线| 日韩城人网站| 操碰在线免费| 韩日午夜在线资源一区二区| 亚洲精品久久久久中文字幕二区| 成人免费av网站| 国产欧美高清视频在线| 国产一区二区三区福利| 日本在线成人一区二区| 日韩中文字幕免费| 亚洲午夜影视影院在线观看| 亚洲人成高清| 四虎在线精品| 最新亚洲伊人网| 成人动漫一区二区| 欧美 日韩 国产精品免费观看| 青青伊人久久| 九九九九精品九九九九| 亚洲欧美日韩精品一区二区| 欧美日韩国产不卡在线看| 91av在线播放视频| 欧美精品一线| 爱啪视频在线观看视频免费| 欧美精品性生活| 亚洲最大的av网站| 在线观看日韩专区| 五月天视频一区| 久久久五月天| 蜜桃久久久久久| 亚洲黄色三级| 密臀av在线播放| 国产h色视频在线观看| 国产精品福利视频| 中文字幕欧美国内| 亚洲第一福利一区| 久久99精品久久久久婷婷| 中文字幕伦av一区二区邻居| 一区二区传媒有限公司| 欧美精品总汇| 国产视频一区三区| 婷婷久久综合九色综合伊人色| 欧美久久久久久蜜桃| 最新国产一区二区|