3

我正在查看AMD64 ABI,它似乎没有指定如何传递空类类型。对于空类成员函数,它似乎this像往常一样传递,但对于空类,Clang 生成的代码似乎只是忽略了这个类。根据 AMD64 ABI,这是否正确?

4

1 回答 1

2

虽然尚不清楚确切的问题是什么,但关于 C++ ABI 是什么的答案非常清楚:

对于 C++ ABI,我们将使用 IA-64 C++ ABI 并适当地实例化它。该 ABI 的当前草案可在以下位置获得:

链接到 Itanium ABI 规范的当前位置

这说:

空类的传递与普通类没有什么不同。如果传入寄存器,则不得在构成该类的所有寄存器上设置 NaT 位。

单字节参数槽的内容是未指定的,被调用者可能不依赖于任何特定的值。在 Itanium 上,如果参数槽与寄存器关联,则不得设置关联的 NaT 位。

此处提供了另一个提示:

将返回空类类型的结果,就好像它是包含单个字符的结构一样,即 struct S { char c; };。返回寄存器的实际内容是未指定的。在 Itanium 上,不得设置相关的 NaT 位。

因此,应该将空类视为包含单个字符的结构,但从不使用该单个字符。

clang当然,空类可能存在错误。虽然我对此表示怀疑,但公平地说。

于 2013-04-24T10:18:55.530 回答