2015-05-18 21 views
3

我理解爲Micrsoft和System V AMD64 ABI傳遞32位和64位整數(和指針),浮點數和雙精度64位代碼的調用約定。但是我不清楚那些複合數據類型的調用約定。具有複合日期類型的調用約定

更清楚在具有外部鏈接功能(即不是static inline函數)的函數中通過結構,類和聯合的值傳遞約定是什麼?我特別感興趣的簡單的結構,例如

typedef struct doublefloat { float hi; float lo; } doublefloat; 
typedef struct doubledouble { double hi; double lo; } doubledouble; 
typedef struct int128 { int64_t hi; int64_t lo; } int128; 

doublefloat foof(float a, float b);  
doubledouble food(double a, double b); 
float foo3(doubledouble a, doubledouble b);  
int128 fooi(int64_t a, int64_t b); 

以下是我在GCC觀察到(用-O3)

  • foofhi返回和lo打包到的XMM0第一個64位。
  • food返回hilo分成XMM0XMM1
  • foo3傳入XMM0ahilobXMM1XMM2,和XMM3
  • fooi返回hilo成RDA和RDX

昂納霧描述了在 http://www.agner.org/optimize/calling_conventions.pdf

對於每個編譯器的細節(其通過觀測與同意)看表6方法用於傳遞結構,類和聯合對象表7.返回結構,類和聯合對象的方法

對於64位代碼,他的表格被分成Windows和Linux/BSD/Mac,而不是每個編譯器,所以這意味着對我來說複合數據類型有一些標準。這是正確的還是傳遞和返回可能由每個編譯器或編譯器的每個版本定義的複合數據類型(即可能隨着下一版本而改變)。

請注意,我明白在實踐中,在許多情況下static inline可能是最好的反正。還要注意的是,即使C沒有類,我仍然對結構和聯合在C中的值是如何傳遞感興趣,而不僅僅是C++,這就是爲什麼我包含了C標記。

回答

2

確實存在一些標準。例如,SystemV AMD64 ABI document詳細描述了聚合的參數傳遞(從第17頁開始)。由於有多個頁面,因此我不會複製文本的相關部分。

並非所有的平臺都可能有如此完備的文檔。

+2

謝謝。我看到SystemV AMD64 ABI實際上定義了比我意識到的更多的東西(我不應該聲稱我理解它)。所以聚合類型似乎確定了。這解釋了爲什麼在Agner的表中,每個操作系統(在64位模式下)都有值,而不是每個編譯器。 –

+0

ARM還有一個標準http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf,但我無法使用描述映射的文檔C/C++ ... – gsg

相關問題