? 最近學習過程中碰到有關函數調用方法,如:__stdcal,_cdecl和__fastcall。查閱了一些相關的資料和別人的經驗,我總結如下:

          __stdcal,_cdecl,__fastcall有三個方面來區分:

          1:函數參數是按什么順序壓入棧中的。

          2:調用完畢后是由誰來釋放棧中的空間的。(這個問題主要是因為函數傳遞過程中是存放在棧中的,可以選擇調用者釋放空間,也可以選擇被調用者釋放。)

          3:產生函數名的修飾方法。

          ???????????????????????????????????????????????????
          ?__stdcal
          ?_cdecl
          ?__fastcall
          ?
          1
          ?從右到左
          ?從右到左
          ?一般指傳送不超過4個字節的參數,通過寄存器,不用棧,這樣比較快
          ?
          2
          ?函數自己解決棧的清除工作,如Windows的API函數
          ?棧的清除工作是由調用者(不同的編譯器產生棧的方式不盡相同)
          ?從左邊開始的兩個大小不大于4個字節(DWORD)的參數分別放在ECX和EDX寄存 器,其余的參數仍舊自右向左壓棧傳送
          ?
          3
          ?_func@12
          ??func@@ZAXXZ
          ?@func@12
          ?

          為了避免由編譯器造成的問題,強烈建議在調用時使用__stdcal。

          ?

          posted on 2009-06-16 15:35 -274°C 閱讀(506) 評論(0)  編輯  收藏 所屬分類: C++

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網站

          關注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 917238
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 辽中县| 广南县| 巢湖市| 大兴区| 北碚区| 石屏县| 金昌市| 樟树市| 湟源县| 海丰县| 通州区| 武宁县| 岗巴县| 巴楚县| 鲁山县| 迁西县| 大宁县| 桐庐县| 铜鼓县| 泰兴市| 贵州省| 平乐县| 陆川县| 滕州市| 浦东新区| 杭州市| 通辽市| 大关县| 宣恩县| 仪征市| 略阳县| 谢通门县| 巴南区| 庄河市| 大英县| 永春县| 西丰县| 江永县| 富源县| 安陆市| 个旧市|