【发布时间】: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 快照就像
编译器似乎为此成员函数自动生成了附加变量。 我的问题是:
-
只有当我们将实现放在类声明中时才会发生这种情况,对吗? 对于将其实现隐藏在另一个 cpp 文件中的类来说,这似乎是不可移植的。
-
这种隐式添加的变量有名称吗?我的意思是,当我们为 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++