C++ 使用复合日期类型调用约定
我了解用于传递32位和64位整数(以及指针)、浮点和双精度的调用约定,适用于Microsoft和System V AMD64 ABI的64位代码。但我不清楚复合数据类型的调用约定是什么 更清楚的是,在具有外部链接的函数(即非C++ 使用复合日期类型调用约定,c++,c,gcc,x86,calling-convention,C++,C,Gcc,X86,Calling Convention,我了解用于传递32位和64位整数(以及指针)、浮点和双精度的调用约定,适用于Microsoft和System V AMD64 ABI的64位代码。但我不清楚复合数据类型的调用约定是什么 更清楚的是,在具有外部链接的函数(即非静态内联函数)中,按值传递结构、类和联合的调用约定是什么?我对简单的结构特别感兴趣,比如 typedef struct doublefloat { float hi; float lo; } doublefloat; typedef struct doubledouble {
静态内联
函数)中,按值传递结构、类和联合的调用约定是什么?我对简单的结构特别感兴趣,比如
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
前64位的XMM0
和hi
李>lo
将food
和hi
返回到lo
和XMM0
XMM1
在foo3
、XMM0
、XMM1
和XMM2
中从XMM3
和a
传递b
和hi
XMM2
将fooi
和hi
返回到rda和rdx中lo
请注意,我知道在实践中,在许多情况下,
静态内联
可能是最好的选择。还要注意的是,即使C没有类,我仍然对C中的结构和联盟如何通过值而不仅仅是C++感兴趣,这就是为什么我包含了C标记。 < P>有些标准确实存在。例如,本文详细描述了聚合的参数传递(从第17页开始)。我不会在这里复制文本的相关部分,因为有好几页
并非所有的平台都有如此完善的文档记录。谢谢。我看到SystemV AMD64 ABI实际上比我意识到的定义多得多(我不应该声称我理解它)。因此,聚合类型看起来确实是被定义的。这就解释了为什么在Agner的表中,每个操作系统(64位模式)都有值,而不是每个编译器。ARM at也有一个标准,但我很难得到描述C/C++映射的文档。。。