【问题标题】:What is the actual parameter list of member function created by the compiler?编译器创建的成员函数的实际参数列表是什么?
【发布时间】:2021-12-29 09:54:05
【问题描述】:

我有一个关于传递给 C++ 成员函数以调用的值的问题。当我反汇编像

这样的C++成员函数时
void myClass::memberFunction() const;

我假设它传递了一个隐式参数this作为第一个也是唯一的参数,但实际上可能传递了两个或多个参数。

我用 hopper 反汇编了 libobjc.A.dylib (iOS14.8-arm64e)。这个函数class_rw::method() const没有参数,所以我认为它只传递了this指针作为唯一的参数,但它传递了另一个(x1)参数。

然后实际代码在苹果上是开源的 https://opensource.apple.com/source/objc4/objc4-818.2/runtime/objc-runtime-new.mm.auto.html 快照就像

编译器似乎为此成员函数自动生成了附加变量。 我的问题是:

  1. 只有当我们将实现放在类声明中时才会发生这种情况,对吗? 对于将其实现隐藏在另一个 cpp 文件中的类来说,这似乎是不可移植的。

  2. 这种隐式添加的变量有名称吗?我的意思是,当我们为 c++ 开发编译器时,我们对这种优化的要求是什么?

【问题讨论】:

  • fyi - 有一个 C++ ABI 文档 Itanium C++ ABI,但我不知道编译器供应商有多密切关注它。
  • 免责声明;我完全不明白这里的组装。但也许第二个参数是指向返回变量的指针。就像在哪里写返回结构,假设它是一个结构。这里有解释:stackoverflow.com/a/37186126/432492
  • 问题是关于 AArch64(64 位 ARM),它有自己的 ABI 约定,与英特尔的不同。 ARM documentation 表示 x0 用于在 C++ 中传递 this,因此,OP 正在询问 x1 的用途。
  • 你的函数是否按值返回?如果是这样并且返回的值没有通过寄存器传递,那么通常会有第二个“隐藏”参数,它表示指向返回值存储的指针。在这个现场演示中,似乎是x8:godbolt.org/z/dGWcxs4qs。
  • 您的代码来自 Objective C 运行时;这与 C++ 本身无关。

标签: c++ compiler-construction clang clang++


【解决方案1】:

来自ARM64 procedure call standard:

结果返回

从函数返回结果的方式取决于该结果的类型:
  • 如果函数结果的类型 T 是 void func(T arg) 要求根据参数传递中的规则将 arg 作为寄存器(或寄存器集)中的值传递,然后将结果返回到用于此类参数的相同寄存器中。
  • 否则,调用者应保留一块足够大小和对齐的内存来保存结果。内存块的地址应作为附加参数传递给 x8 中的函数。被调用者可以在子程序执行期间的任何时候修改结果内存块(不需要被调用者保留存储在x8中的值)。

所以这似乎是第二种类型的示例——返回类型method_array_t 超过 16 个字节,因此调用者为其分配空间并将指向该空间的指针作为额外参数传递。

【讨论】:

  • 这听起来完全可以解释“x1”:+1。如果 OP 创建了一个 [SSCCE](SSCCE.org) 来验证这是否适用于他/她的具体情况,那肯定会有所帮助。
猜你喜欢
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
相关资源
最近更新 更多