2010-02-23 106 views
7

這些是什麼?作爲一名開發人員,我受到了怎樣的影響?什麼是自定義調用約定?

相關:
What are the different calling conventions in C/C++ and what do each mean?

+0

在什麼情況下? Win32的? Win64平臺? Linux呢?的Solaris?英特爾? PowerPC的? – 2010-02-23 18:28:01

+2

重複:http://stackoverflow.com/questions/949862/what-are-the-different-calling-conventions-in-cc-and-what-do-each-mean – Earlz 2010-02-23 18:28:45

+11

我懷疑那些投票結束這個(a)**不明白什麼_custom_調用約定是**或(b)**沒有正確讀取問題**。它們是一個特殊的優化,不包含在重複問題中。投票重新打開,並刪除重複的信息。 – 2010-02-23 18:30:22

回答

9

一個調用約定描述的東西可以如何調用另一個函數。這需要將參數和狀態傳遞給另一個函數,以便它可以正確執行並返回控件。這樣做的方式必須進行標準化和規定,以便編譯器知道如何通過被調用的遠程函數對參數進行排序。有幾個標準調用約定,但最常見的是fastcallstdcall,並cdecl

通常,術語自定義調用約定是有點用詞不當的,是指兩種情況之一:

  • 非標準調用約定或一個不是廣泛使用(例如,如果你是從頭構建一個架構)。

  • 編譯器/鏈接器可以執行的特殊優化,使用一次調用約定來提高性能。

在後一種情況下,這會導致一些值,否則會推入堆棧而不是存儲在寄存器中。編譯器會根據代碼中參數的使用方式來做出這個決定。例如,如果該參數將被用作循環索引的最大值,以便將索引與每次迭代中的最大值進行比較以查看是否應該繼續,那麼將它移動到寄存器。

如果執行優化,通常會減少代碼大小並提高性能。

作爲一名開發人員,我是如何受這些影響的?

從你作爲開發者的角度來看,你可能不在乎;這是一個會自動發生的優化。

1

每一種語言,調用函數時,有哪些參數將在寄存器變量傳遞VS堆棧上的慣例,以及如何返回值將被退回。

有時比標準的一個不同的約定使用而這被稱爲自定義調用約定。

這是在不同語言之間互操作時最常見的。例如,C和Pascal關於如何傳遞參數有不同的約定。從C的角度來看,Pascal調用約定可以被稱爲自定義調用約定。

+0

「pascal」不是自定義調用約定 - 這是一種正常的,有名的調用約定。另外,這是歷史,不是嗎?來自16位天的遺物? – Steve314 2010-02-23 18:37:55

+1

我說從C的角度來看這是一個自定義調用約定,這是正確的。此外,這是一個合適的例子來解釋這個概念,當然不值得贊成。 – 2010-02-23 19:00:47

0

除非你直接操縱堆棧或內聯彙編寫引用局部變量,它不會影響你。或者,如果你的庫與不同的調用約定鏈接起來

什麼是:大多數編譯器等都使用標準調用約定,如cdecl,其中函數參數按特定順序推送到堆棧等。

+0

這不太對。他詢問了關於_custom_調用約定,這是一種特殊的優化,並且不符合任何特定的現有調用約定。 – 2010-02-23 18:42:14

1

我不認爲你真的需要照顧。

正常調用約定之類的東西__stdcall和__fastcall。它們決定你的呼叫簽名如何轉換爲堆棧佈局,誰(調用者或被調用者)負責保存和恢復寄存器等。例如,__fastcall應使用更多寄存器,其中__stdcall將使用更多堆棧。

自定義調用約定爲特定的功能和它的使用方式進行了優化。它們只發生在IIRC中,用於特定模塊本地的功能。這就是編譯器如何知道如何使用它以及如何知道外部調用者不需要能夠指定約定的方式。

此基礎上,你的編譯器會自動使用它們酌情,你的代碼將稍快的運行和/或採取略少的空間,但你並不真正需要擔心。