当APP_ABI
includes时armeabi-v7a
,Android 的构建系统将包含-mthumb
作为编译选项。
ARMv7-a 是一个32 位处理器系列。为什么Android使用-mthumb
而不是-marm
?
必须使用 NDK 编译的本机组件-mthumb
吗?或者可以使用-marm
吗?
如果-marm
可以,是否需要提供任何互通选项?
当APP_ABI
includes时armeabi-v7a
,Android 的构建系统将包含-mthumb
作为编译选项。
ARMv7-a 是一个32 位处理器系列。为什么Android使用-mthumb
而不是-marm
?
必须使用 NDK 编译的本机组件-mthumb
吗?或者可以使用-marm
吗?
如果-marm
可以,是否需要提供任何互通选项?
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 无论您选择其中哪一个,您都不需要任何额外的交互操作选项。