C++ 使用复合日期类型调用约定

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 {

我了解用于传递32位和64位整数(以及指针)、浮点和双精度的调用约定,适用于Microsoft和System V AMD64 ABI的64位代码。但我不清楚复合数据类型的调用约定是什么

更清楚的是,在具有外部链接的函数(即非
静态内联
函数)中,按值传递结构、类和联合的调用约定是什么?我对简单的结构特别感兴趣,比如

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
    返回压缩到
    XMM0
    前64位的
    hi
    lo
  • food
    hi
    lo
    返回到
    XMM0
    XMM1
  • foo3
    XMM0
    XMM1
    XMM2
    XMM3
    中从
    a
    b
    传递
    hi
    XMM2
  • fooi
    hi
    lo
    返回到rda和rdx中
Agner Fog描述了每个编译器在

见表6。传递结构、类和联合对象的方法以及 表7。用于返回结构、类和联合对象的方法

对于64位代码,他的表分为Windows和Linux/BSD/Mac,而不是每个编译器,因此这对我来说意味着复合数据类型有一些标准。这是正确的,还是传递和返回每个编译器或编译器的每个版本可能定义的复合数据类型(即可能随下一个版本而更改)


请注意,我知道在实践中,在许多情况下,
静态内联
可能是最好的选择。还要注意的是,即使C没有类,我仍然对C中的结构和联盟如何通过值而不仅仅是C++感兴趣,这就是为什么我包含了C标记。

< P>有些标准确实存在。例如,本文详细描述了聚合的参数传递(从第17页开始)。我不会在这里复制文本的相关部分,因为有好几页


并非所有的平台都有如此完善的文档记录。

谢谢。我看到SystemV AMD64 ABI实际上比我意识到的定义多得多(我不应该声称我理解它)。因此,聚合类型看起来确实是被定义的。这就解释了为什么在Agner的表中,每个操作系统(64位模式)都有值,而不是每个编译器。ARM at也有一个标准,但我很难得到描述C/C++映射的文档。。。