本机组件,armeabi-v7a和拇指?

时间:2014-09-08 08:22:24

标签: android android-ndk ndk-build

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

ARMv7-a是32-bit processor系列。为什么Android使用-mthumb而不是-marm

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

如果-marm没问题,是否需要存在任何互通选项?

1 个答案:

答案 0 :(得分:7)

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则不需要任何额外的互通选项,无论您选择哪一个。< / p>