c/c 參數(shù)入棧順序和參數(shù)計算順序
時間:2021-08-19 16:06:05
手機看文章
掃描二維碼
隨時隨地手機看文章
[導(dǎo)讀]關(guān)注、星標公眾號,直達精彩內(nèi)容ID:技術(shù)讓夢想更偉大作者:李肖遙如果大家細心的話應(yīng)該知道c/c語言函數(shù)參數(shù)入棧順序為從右至左,那么為什么這樣呢?來看看兩個知識點:參數(shù)的計算順序與壓棧順序。參數(shù)入棧順序c/c中規(guī)定了函數(shù)參數(shù)的壓棧順序是從右至左,函數(shù)調(diào)用協(xié)議會影響函數(shù)參數(shù)的入棧方式...
關(guān)注、星標公眾號,直達精彩內(nèi)容ID:技術(shù)讓夢想更偉大作者:李肖遙
如果大家細心的話應(yīng)該知道c/c 語言函數(shù)參數(shù)入棧順序為從右至左,那么為什么這樣呢?來看看兩個知識點:參數(shù)的計算順序與壓棧順序。
官方詳解可見:https://msdn.microsoft.com/en-us/library/984x0h58(v=vs.120).aspx通常情況下c/c 默認入棧方式
如果大家細心的話應(yīng)該知道c/c 語言函數(shù)參數(shù)入棧順序為從右至左,那么為什么這樣呢?來看看兩個知識點:參數(shù)的計算順序與壓棧順序。
參數(shù)入棧順序
c/c 中規(guī)定了函數(shù)參數(shù)的壓棧順序是從右至左,函數(shù)調(diào)用協(xié)議會影響函數(shù)參數(shù)的入棧方式、棧內(nèi)數(shù)據(jù)的清除方式、編譯器函數(shù)名的修飾規(guī)則等。參數(shù)傳遞和命名約定
Visual C/C 編譯器支持以下調(diào)用約定。| 關(guān)鍵字 | 堆棧清理 | 參數(shù)傳遞 |
|---|---|---|
| __cdecl | Caller | 以相反的順序(從右到左)將參數(shù)壓入堆棧 |
| __clrcall | n/a | 按順序(從左到右)將參數(shù)加載到 CLR 表達式堆棧 |
| __stdcall | Callee | 以相反的順序(從右到左)將參數(shù)壓入堆棧 |
| __fastcall | Callee | 存儲在寄存器中,然后壓入堆棧 |
| __thiscall | Callee | 壓入堆棧;此指針存儲在 ECX 中 |
| __vectorcall | Callee | 存儲在寄存器中,然后以相反的順序(從右到左)壓入堆棧 |
:__cdel,也就是以右到左將參數(shù)壓入堆棧,Windows api使用的是__stdcall方式,__fastcall適用于對性能要求較高的場合。自定義參數(shù)入棧形式
當(dāng)然我們也可以自定義函數(shù)的入棧順序,常用形式如下//函數(shù)返回值??入棧規(guī)則??函數(shù)名(參數(shù)類型?參數(shù)名);
int?__cdecl?get_name_index(const?std::string 




