使用复合日期类型调用约定
Calling conventions with composite date types
我理解在microsoft和System V AMD64 ABI的64位代码中传递32位和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
、XMM1
、XMM2
和XMM3
中的a
和b
中通过hi
和lo
。 -
fooi
返回hi
和lo
为rda和rdx
Agner Fog描述了每个编译器的细节(与观察一致)http://www.agner.org/optimize/calling_conventions.pdf
见表6。方法用于传递结构、类和联合对象和表7所示。返回结构、类和联合对象的方法。
对于64位代码,他的表分为Windows和Linux/BSD/Mac,而不是每个编译器,所以这对我来说意味着有一些复合数据类型的标准。这是正确的吗?或者复合数据类型的传递和返回是否可能由每个编译器或每个版本的编译器定义(即可能在下一个版本中更改)?
请注意,我理解在实践中,在许多这些情况下,static inline
可能是最好的。还要注意,即使C没有类,我仍然对结构和联合如何在C中按值传递感兴趣,而不仅仅是c++,这就是为什么我包含了C标签。
确实存在一些标准。例如,SystemV AMD64 ABI文档详细描述了聚合的参数传递(从第17页开始)。这篇文章有好几页,我就不抄了。
并不是所有的平台都有这么好的文档。
相关文章:
- 为什么在 x64 中忽略__stdcall调用约定?
- 窗口调用约定
- 我应该提到纯虚函数中的调用约定吗?
- 如何使用gcc指定stdcall调用约定
- Clang:x86 FPU调用约定
- 该标准是否说明了例外和不同调用约定的共存
- Clang++的InterlockedExchange的32位调用约定错误,但MSVC可以
- std::sort & comp - 调用约定?
- 如何为类 /块 /范围选择C 调用约定
- DLL 的"good"调用约定是什么?
- 结构中重载运算符的调用约定
- 'ShowSUM':__declspec(dllexport)不能应用于具有__clrcall调用约定的函数
- x86-64 调用约定中的返回值
- 内联功能和调用约定
- 正在直接显示筛选器中调用约定
- 何时使用`__fastcall`调用约定
- 为C++结构定义显式析构函数如何影响调用约定
- 由于使用 MFC 时"__cdecl"和"__thiscall"调用约定不匹配而导致的链接器错误?
- Microsoft Visual C++是否未使用带有浮点的C/C++调用约定
- 在Visual Studio中调用约定