c/c 參數(shù)入棧順序和參數(shù)計(jì)算順序
時(shí)間:2021-08-19 16:06:05
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容ID:技術(shù)讓夢(mèng)想更偉大作者:李肖遙如果大家細(xì)心的話應(yīng)該知道c/c語(yǔ)言函數(shù)參數(shù)入棧順序?yàn)閺挠抑磷螅敲礊槭裁催@樣呢?來(lái)看看兩個(gè)知識(shí)點(diǎn):參數(shù)的計(jì)算順序與壓棧順序。參數(shù)入棧順序c/c中規(guī)定了函數(shù)參數(shù)的壓棧順序是從右至左,函數(shù)調(diào)用協(xié)議會(huì)影響函數(shù)參數(shù)的入棧方式...
關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容ID:技術(shù)讓夢(mèng)想更偉大作者:李肖遙
如果大家細(xì)心的話應(yīng)該知道c/c 語(yǔ)言函數(shù)參數(shù)入棧順序?yàn)閺挠抑磷?,那么為什么這樣呢?來(lái)看看兩個(gè)知識(shí)點(diǎn):參數(shù)的計(jì)算順序與壓棧順序。
官方詳解可見:https://msdn.microsoft.com/en-us/library/984x0h58(v=vs.120).aspx通常情況下c/c 默認(rèn)入棧方式
如果大家細(xì)心的話應(yīng)該知道c/c 語(yǔ)言函數(shù)參數(shù)入棧順序?yàn)閺挠抑磷?,那么為什么這樣呢?來(lái)看看兩個(gè)知識(shí)點(diǎn):參數(shù)的計(jì)算順序與壓棧順序。
參數(shù)入棧順序
c/c 中規(guī)定了函數(shù)參數(shù)的壓棧順序是從右至左,函數(shù)調(diào)用協(xié)議會(huì)影響函數(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 表達(dá)式堆棧 |
__stdcall | Callee | 以相反的順序(從右到左)將參數(shù)壓入堆棧 |
__fastcall | Callee | 存儲(chǔ)在寄存器中,然后壓入堆棧 |
__thiscall | Callee | 壓入堆棧;此指針存儲(chǔ)在 ECX 中 |
__vectorcall | Callee | 存儲(chǔ)在寄存器中,然后以相反的順序(從右到左)壓入堆棧 |
:__cdel
,也就是以右到左將參數(shù)壓入堆棧,Windows api使用的是__stdcall
方式,__fastcall
適用于對(duì)性能要求較高的場(chǎng)合。自定義參數(shù)入棧形式
當(dāng)然我們也可以自定義函數(shù)的入棧順序,常用形式如下//函數(shù)返回值??入棧規(guī)則??函數(shù)名(參數(shù)類型?參數(shù)名);
int?__cdecl?get_name_index(const?std::string