2

APP_ABIincludes时armeabi-v7a,Android 的构建系统将包含-mthumb作为编译选项。

ARMv7-a 是一个32 位处理器系列。为什么Android使用-mthumb而不是-marm

必须使用 NDK 编译的本机组件-mthumb吗?或者可以使用-marm吗?

如果-marm可以,是否需要提供任何互通选项?

4

1 回答 1

8

Android 使用-mthumb它是因为它产生更紧凑的代码。处理器的位数与它无关。

在正常的 ARM 指令集中,每条指令都是 32 位的,每条指令都非常具有表现力(有不同的指令可以做很多不同的事情)。不幸的是,这也意味着代码可能有点大,因为每条指令需要 4 个字节。

拇指指令集被引入来解决这个问题 - 这里每条指令只有 16 位长,因此您可以在同一空间中容纳两倍的指令,但由于指令更短,因此没有那么多不同的指令。每条指令仍然在 32 位寄存器上运行,并且在其他方​​面的行为与 ARM 指令完全相同,因此它只是一种不同的、更紧凑的方式来编写(大部分)ARM 指令的子集。由于指令数量有限,大多数事情往往需要比 ARM 模式更多的指令。因此,根据代码实际执行的操作,代码大小的实际减少并不完全是 50%。此外,由于可能有比以前更多的指令,它实际上可能比以前运行得更慢。(但由于它更小,它使用的指令缓存更少,

在实践中,Thumb 代码往往比 ARM 代码慢,但更紧凑,因此对于大小比速度更重要的代码,您会使用 Thumb。

由于 Thumb2(在 ARMv7 中可用),Thumb 指令集的表现力更强,因此性能差异更小 - 这就是它在 Android 中默认启用的原因 - 在几乎所有情况下,它都会减少代码大小而不会显着影响的表现。如果您有一些对性能非常关键的代码,您可能需要进行基准测试,看看它是否对您有害或有帮助。(对于使用 ndk-build 和 Android.mk 进行构建,请检查 LOCAL_ARM_MODE 变量。)

如果您手动构建代码,您可以选择是否添加-mthumb-marm,并且 AFAIK 无论您选择其中哪一个,您都不需要任何额外的交互操作选项。

于 2014-09-08T08:37:10.277 回答