我正在查看AMD64 ABI,它似乎没有指定如何传递空类类型。对于空类成员函数,似乎this
像往常一样传递,但对于空类,Clang生成的代码似乎只是忽略了这个类。根据AMD64 ABI,这是正确的吗?
答案 0 :(得分:2)
虽然目前还不清楚究竟是什么问题,但答案很清楚C ++ ABI是什么:
对于C ++ ABI,我们将使用IA-64 C ++ ABI并实例化它 适当。该ABI的当前草案可在以下网址获得:
Link to current location of Itanium ABI spec
这说:
空类的传递方式与普通类没有区别。如果 传入寄存器时,不能在所有寄存器上设置NaT位 弥补上课。
单字节参数槽的内容未指定,并且 被调用者可能不依赖于任何特定值。在Itanium上, 如果参数槽关联,则不得设置关联的NaT位 有一个登记册。
此处提供了另一个提示:
将返回一个空类类型的结果,就像它是a一样 包含单个char的struct,即struct S {char c; } ;.该 返回寄存器的实际内容未指定。在Itanium上, 不得设置关联的NaT位。
因此,应该将空类视为包含单个字符的结构,但是从不使用该单个字符。
当然,clang
中可能存在与空类有关的错误。虽然我对此表示怀疑,但这是公平的。