在 C++ 中,一个成员函数最多可以有 2 个隐式参数:this
指针和返回对象的地址。它们位于显式参数之前,但是:哪个先出现?
特别是,我对 Android NDK(基于 gcc,ARM)中发生的事情很感兴趣。
例子:
class MyClass {
public:
int a,b;
MyClass(int aa,int bb):a(aa),b(bb){};
MyClass modif(int da, int db) {return MyClass(a+da,b+db);} //an object is returned
};
最佳答案
您似乎在询问调用约定(在分支到函数之前,哪个寄存器/堆栈参数和返回值存储在何处)。
它很大程度上取决于目标 ABI,即便如此它也相当复杂。对于 ARMv5/6/7,Procedure call standard [pdf]是你的圣经。
如果您真正关心的话,您应该真正阅读整篇文章,但这里是您感兴趣的部分:
- 在 r0 中返回一个不大于 4 个字节的复合类型。
- 大于 4 字节的复合类型,或者其大小不能由调用者和被调用者静态确定的,存储在内存中调用函数时作为额外参数传递的地址。
- 如果子程序是一个在内存中返回结果的函数,那么结果的地址放在 在 r0 中,NCRN 设置为 r1。
- 如果参数的单词大小不超过 r4 减去 NCRN,则将参数复制到 核心寄存器,从 NCRN 开始
还有
- 对于 C++,隐式
this
参数作为额外参数传递,紧接在第一个用户参数之前。
因此在大多数情况下,返回的复合值的地址在 $r0
中,而隐式的 this
指针在 $r1
中。
关于android - C++ 隐式参数 : this and the returned object, 的顺序哪个先出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23381779/