当APP_ABI
包含armeabi-v7a
时,Android的构建系统将包含-mthumb
作为编译选项。
ARMv7-a是32-bit processor系列。为什么Android使用-mthumb
而不是-marm
?
使用NDK编译的本机组件必须使用-mthumb
吗?或者可以使用-marm
?
如果-marm
没问题,是否需要存在任何互通选项?
答案 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>