青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ivy-jie

progress ...

C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
  9 Posts :: 41 Stories :: 6 Comments :: 0 Trackbacks

(1) _stdcall調(diào)用
_stdcall是Pascal程序的缺省調(diào)用方式,參數(shù)采用從右到左的壓棧方式,被調(diào)函數(shù)自身在返回前清空堆棧。
WIN32 Api都采用_stdcall調(diào)用方式,這樣的宏定義說明了問題:

  #define WINAPI _stdcall

  按C編譯方式,_stdcall調(diào)用約定在輸出函數(shù)名前面加下劃線,后面加“@”符號(hào)和參數(shù)的字節(jié)數(shù),形如_functionname@number

(2) _cdecl調(diào)用
_cdecl是C/C++的缺省調(diào)用方式,參數(shù)采用從右到左的壓棧方式,傳送參數(shù)的內(nèi)存棧由調(diào)用者維護(hù)。_cedcl約定的函數(shù)只能被C/C++調(diào)用,每一個(gè)調(diào)用它的函數(shù)都包含清空堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會(huì)比調(diào)用_stdcall函數(shù)的大。

  由于_cdecl調(diào)用方式的參數(shù)內(nèi)存棧由調(diào)用者維護(hù),所以變長(zhǎng)參數(shù)的函數(shù)能(也只能)使用這種調(diào)用約定。關(guān)于C/C++中變長(zhǎng)參數(shù)(…)的問題,筆者將另文詳述。

  由于Visual C++默認(rèn)采用_cdecl 調(diào)用方式,所以VC中中調(diào)用DLL時(shí),用戶應(yīng)使用_stdcall調(diào)用約定。
按C編譯方式,_cdecl調(diào)用約定僅在輸出函數(shù)名前面加下劃線,形如_functionname。

  (3) _fastcall調(diào)用
_fastcall調(diào)用較快,它通過CPU內(nèi)部寄存器傳遞參數(shù)。

  按C編譯方式,_fastcall調(diào)用約定在輸出函數(shù)名前面加“@”符號(hào),后面加“@”符號(hào)和參數(shù)的字節(jié)數(shù),形如@functionname@number。

------------------------------------------------------------------------------------------------------------

_cdecl是C和C++程序的缺省調(diào)用方式。每一個(gè)調(diào)用它的函數(shù)都包含清空堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會(huì)比調(diào)用_stdcall函數(shù)的大。函數(shù)采用從右到左的壓棧方式。VC將函數(shù)編譯后會(huì)在函數(shù)名前面加上下劃線前綴。_stdcall是Pascal程序的缺省調(diào)用方式,通常用于Win32 Api中,函數(shù)采用從右到左的壓棧方式,自己在退出時(shí)清空堆棧。VC將函數(shù)編譯后會(huì)在函數(shù)名前面加上下劃線前綴,在函數(shù)名后加上"@"和參數(shù)的字節(jié)數(shù)。_fastcall方式的函數(shù)采用寄存器傳遞參數(shù),VC將函數(shù)編譯后會(huì)在函數(shù)名前面加上"@"前綴,在函數(shù)名后加上"@"和參數(shù)的字節(jié)數(shù)。這兩個(gè)關(guān)鍵字看起來似乎很少和我們打交道,但是看了下面的定義(來自windef.h),你一定會(huì)覺得驚訝:   
#define CALLBACK     __stdcall  
#define WINAPI       __stdcall   
#define WINAPIV      __cdecl   
#define APIENTRY     WINAPI    
#define APIPRIVATE   __stdcall   
#define PASCAL       __stdcall    
#define cdecl _cdecl   
#ifndef CDECL    
#define CDECL _cdecl    
幾乎我們寫的每一個(gè)WINDOWS API函數(shù)都是__stdcall類型的,為什么??

首先,我們談一下兩者之間的區(qū)別:      
WINDOWS的函數(shù)調(diào)用時(shí)需要用到棧(STACK,一種先入后出的存儲(chǔ)結(jié)構(gòu))。當(dāng)函數(shù)調(diào)用完成后,棧需要清除,這里就是問題的關(guān)鍵,如何清除??      
如果我們的函數(shù)使用了_cdecl,那么棧的清除工作是由調(diào)用者,用COM的術(shù)語(yǔ)來講就是客戶來完成的。這樣帶來了一個(gè)棘手的問題,不同的編譯器產(chǎn)生棧的方式不盡相同,那么調(diào)用者能否正常的完成清除工作呢?答案是不能。      
如果使用__stdcall,上面的問題就解決了,函數(shù)自己解決清除工作。所以,在跨(開發(fā))平臺(tái)的調(diào)用中,我們都使用__stdcall(雖然有時(shí)是以WINAPI的樣子出現(xiàn))。       那么為什么還需要_cdecl呢?當(dāng)我們遇到這樣的函數(shù)如fprintf()它的參數(shù)是可變的,不定長(zhǎng)的,被調(diào)用者事先無法知道參數(shù)的長(zhǎng)度,事后的清除工作也無法正常的進(jìn)行,因此,這種情況我們只能使用_cdecl。       到這里我們有一個(gè)結(jié)論,如果你的程序中沒有涉及可變參數(shù),最好使用__stdcall關(guān)鍵字    

posted on 2009-05-23 18:38 ivy-jie 閱讀(2275) 評(píng)論(5)  編輯 收藏 引用

Feedback

# re: _stdcall和_cdec區(qū)別 2012-05-29 10:57 任騰
“如果我們的函數(shù)使用了_cdecl,那么棧的清除工作是由調(diào)用者,用COM的術(shù)語(yǔ)來講就是客戶來完成的。這樣帶來了一個(gè)棘手的問題,不同的編譯器產(chǎn)生棧的方式不盡相同,那么調(diào)用者能否正常的完成清除工作呢?答案是不能。”
問一下,為什么答案是不能?自己產(chǎn)生的堆棧為什么不能自己清除?
  回復(fù)  更多評(píng)論
  

# re: _stdcall和_cdec區(qū)別 2012-06-18 21:12 Honwhy
使用者在另外一個(gè)線程中。@任騰
  回復(fù)  更多評(píng)論
  

# re: _stdcall和_cdec區(qū)別 2012-08-22 18:43 zwxhbxf
當(dāng)我們遇到這樣的函數(shù)如fprintf()它的參數(shù)是可變的,不定長(zhǎng)的,被調(diào)用者事先無法知道參數(shù)的長(zhǎng)度,事后的清除工作也無法正常的進(jìn)行,因此,這種情況我們只能使用_cdecl。  回復(fù)  更多評(píng)論
  

# re: _stdcall和_cdec區(qū)別 2012-08-22 18:48 zwxhbxf
清除工作也無法正常的進(jìn)行不是一種缺陷嗎?難得不管它?  回復(fù)  更多評(píng)論
  

# re: _stdcall和_cdec區(qū)別 2012-09-03 13:34 wd
@任騰因?yàn)槎褩V羔樖接烧{(diào)用者push而減小 所以 只有調(diào)用才知道壓入了多少數(shù)據(jù)%esp要addl多少才能返回之前的調(diào)用狀態(tài)
  回復(fù)  更多評(píng)論
  


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩精品一区二区| 亚洲精品少妇网址| 狠久久av成人天堂| 欧美日韩福利| 久久久国产一区二区三区| 亚洲成色777777女色窝| 欧美一区二区三区视频在线| 亚洲尤物在线视频观看| 一区二区三区国产在线| 一区二区三区视频免费在线观看| 国产精品五月天| 国产老肥熟一区二区三区| 亚洲成色999久久网站| 欧美成人精品高清在线播放| 亚洲电影第1页| 亚洲视频一区| 久久三级视频| 欧美视频在线免费看| 狠狠噜噜久久| 在线亚洲精品| 久久亚洲综合网| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美成年视频| 欧美激情视频给我| 久久久久五月天| 亚洲成色www久久网站| 在线观看不卡av| 亚洲一区二区三区四区视频| 亚洲免费小视频| 欧美亚洲综合另类| 欧美成人一区二区三区在线观看 | 国产色视频一区| 亚洲精品国产精品国自产在线| 香蕉久久一区二区不卡无毒影院 | 国产精品高潮呻吟久久av黑人| 激情婷婷久久| 欧美在线啊v一区| 99av国产精品欲麻豆| 久久久精品国产免大香伊| 国产精品久久久久影院亚瑟| 亚洲高清资源综合久久精品| 欧美一区二区黄色| 一区二区三区欧美| 欧美日韩成人在线观看| 亚洲精品欧美极品| 裸体女人亚洲精品一区| 午夜一区二区三区在线观看| 国产精品久久久对白| 亚洲天堂av在线免费| 亚洲国产精品一区| 久久视频免费观看| 一色屋精品视频免费看| 久久亚洲美女| 欧美一区二区日韩| 国产婷婷色一区二区三区在线 | 欧美11—12娇小xxxx| 欧美中文字幕在线播放| 国产午夜精品理论片a级大结局| 亚洲制服少妇| 亚洲综合国产精品| 国产精品女主播在线观看| 亚洲私人黄色宅男| 亚洲视频在线观看免费| 国产精品高清在线观看| 午夜精品久久久久久久99热浪潮| 亚洲私人黄色宅男| 国产欧美一区二区三区久久| 久久久久久久久久久成人| 欧美一区在线直播| 亚洲第一精品夜夜躁人人爽 | 在线日韩一区二区| 亚洲国产精品一区二区尤物区| 午夜精品区一区二区三| 亚洲理论电影网| 日韩视频在线一区| 欧美日韩免费视频| 欧美一区二视频| 欧美在线观看视频在线| 伊人色综合久久天天| 欧美黄色一区| 欧美日韩一区成人| 久久av一区二区三区漫画| 欧美在线国产| 亚洲国产精品成人综合色在线婷婷| 亚洲第一综合天堂另类专| 欧美日韩国产色综合一二三四| 亚洲综合视频一区| 欧美一区二区久久久| 在线国产精品一区| 日韩视频一区二区三区在线播放免费观看 | 亚洲国产精品99久久久久久久久| 亚洲国产精品欧美一二99| 欧美日韩一区不卡| 久久久久久久一区| 欧美精品亚洲精品| 久久精品123| 欧美精品三级日韩久久| 久久国产免费| 欧美精品激情在线观看| 久久精品30| 欧美理论大片| 久久久精品国产99久久精品芒果| 免费在线日韩av| 久久精品人人做人人爽| 欧美日韩亚洲高清一区二区| 欧美成人精品在线观看| 欧美视频精品在线观看| 欧美成人久久| 国产亚洲欧美一级| 亚洲视频综合在线| 亚洲精品在线观| 久久精品免费观看| 亚洲欧美清纯在线制服| 欧美成人黑人xx视频免费观看| 欧美中文字幕第一页| 欧美日韩不卡一区| 91久久在线| 亚洲高清在线视频| 久久久国产精彩视频美女艺术照福利| 亚洲天堂黄色| 欧美日韩高清免费| 最近中文字幕mv在线一区二区三区四区 | 亚洲人午夜精品免费| 欧美三级在线播放| 美女久久一区| 国产欧美精品国产国产专区| 亚洲日本中文字幕免费在线不卡| 一区二区亚洲精品| 久久蜜桃香蕉精品一区二区三区| 久久精品理论片| 国产欧美日韩一区二区三区在线观看 | 狠狠色丁香久久婷婷综合_中| 亚洲午夜高清视频| 亚洲欧美日韩精品久久奇米色影视| 欧美劲爆第一页| 91久久精品日日躁夜夜躁国产| 亚洲黄色高清| 久久一区国产| 欧美成人亚洲| 亚洲国产另类 国产精品国产免费| 久久久噜噜噜| 欧美激情精品久久久久久黑人| 亚洲第一网站| 欧美激情视频网站| av成人激情| 午夜精品久久久久久久久久久久久| 欧美日韩三级在线| 亚洲一区免费观看| 久久久久久久久岛国免费| 激情久久综艺| 欧美国产日韩一区二区在线观看| 亚洲精品久久久久久久久久久久| 99riav国产精品| 国产精品毛片在线看| 欧美一区二区三区视频| 欧美18av| 亚洲婷婷国产精品电影人久久| 欧美精品电影| 亚洲欧美视频| 老司机午夜精品视频| 一本久道久久综合婷婷鲸鱼| 国产精品久久久久99| 香蕉久久a毛片| 亚洲国产欧美国产综合一区| 亚洲欧美日韩国产另类专区| 国内成人精品一区| 久久综合久久综合这里只有精品| 亚洲精品资源| 久久久夜精品| av成人黄色| 国产综合18久久久久久| 欧美a级片一区| 亚洲自拍16p| 91久久精品国产| 久久人91精品久久久久久不卡| 91久久久精品| 国产精品日韩欧美综合| 欧美 日韩 国产精品免费观看| 亚洲欧美第一页| 亚洲激情视频网| 久久久久国产精品午夜一区| 亚洲日本欧美天堂| 国产一区二区在线免费观看| 欧美日韩午夜剧场| 久久久久久久一区二区三区| 亚洲午夜视频在线| 亚洲精品日韩欧美| 国产精品一区免费观看| 亚洲精品欧美| 欧美黑人多人双交| 国产精品99久久久久久www| 最新国产乱人伦偷精品免费网站| 久久综合九色综合欧美就去吻 | 亚洲免费成人av电影| 亚洲区一区二区三区| 欧美日韩不卡在线| 亚洲人成高清| 久久99伊人| 欧美午夜精品久久久久久浪潮| 亚洲精品一区二区三区四区高清|