android - C++ 隐式参数 : this and the returned object, 的顺序哪个先出现?

标签 android c++ android-ndk g++ arm

在 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/

相关文章:

android - 无法打开 https 流 - 找不到协议(protocol)(带有 openssl 的 ffmpeg)

android - Firefox for Android 内容提供商?

javascript - React Native : In an array of Text Inputs which are looped then displayed, 如何获取第n个元素并分别修改这些元素?

c++ - C++ 的通用线程 C 包装器函数

c++ - C++11 中具有 C 链接的复杂类型

C++17:使用 std::optional 评估枚举是否包含值

java - 如何在 fragment 中隐藏工具栏中的 OptionMenu?

android - If then else 不能在 Android 中工作/与 final 混淆

android - logcat 中的回溯不完整

android - 如何将控制从字符串委托(delegate)给 C 中的一系列函数