我理解爲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)
foof
hi
返回和lo
打包到的XMM0
第一個64位。food
返回hi
和lo
分成XMM0
和XMM1
。foo3
傳入XMM0
從a
hi
和lo
和b
,XMM1
,XMM2
,和XMM3
。fooi
返回hi
和lo
成RDA和RDX
昂納霧描述了在 http://www.agner.org/optimize/calling_conventions.pdf
對於每個編譯器的細節(其通過觀測與同意)看表6方法用於傳遞結構,類和聯合對象和 表7.返回結構,類和聯合對象的方法。
對於64位代碼,他的表格被分成Windows和Linux/BSD/Mac,而不是每個編譯器,所以這意味着對我來說複合數據類型有一些標準。這是正確的還是傳遞和返回可能由每個編譯器或編譯器的每個版本定義的複合數據類型(即可能隨着下一版本而改變)。
請注意,我明白在實踐中,在許多情況下static inline
可能是最好的反正。還要注意的是,即使C沒有類,我仍然對結構和聯合在C中的值是如何傳遞感興趣,而不僅僅是C++,這就是爲什麼我包含了C標記。
謝謝。我看到SystemV AMD64 ABI實際上定義了比我意識到的更多的東西(我不應該聲稱我理解它)。所以聚合類型似乎確定了。這解釋了爲什麼在Agner的表中,每個操作系統(在64位模式下)都有值,而不是每個編譯器。 –
ARM還有一個標準http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf,但我無法使用描述映射的文檔C/C++ ... – gsg