将C++ x86代码移植到ARM处理器的主要注意事项是什么?
我知道/听说过的(但我不知道他们是不是真的有问题,甚至是真的 - 请核实):
程序员应该注意的任何其他差异和陷阱?
Igo*_*sky 16
任何体面的编译器都支持ARM上的64位数学运算,因此可能没有必要减少变量的范围.但是,ARM 本身就是 32位,所以如果你不需要全范围,那么使用32位变量会更快.同样,32位变量比8位和16位变量快,所以如果你有任何char
或short
循环计数器,可能值得将它们更新为int
s(或更好,unsigned int
s).
字节顺序通常不是问题 - 大多数ARM芯片要么以小端运行,要么可以在大端和小端之间切换.什么是问题是对齐.访问未对齐的数据时,x86非常宽容.在ARM上,这会产生异常,或者(在以后的archs上)会使代码运行得更慢.这通常由编译器负责,但您需要注意是否使用汇编或压缩结构.
可能会让你感到震惊的另一件事是签名/无符号变量.直到最近,ARM还没有加载/存储signed char
s的快速指令,因此传统上ARM 上char
没有签名.如果您的代码依赖于char
签名,则可能存在一些问题.快速修复可能是将编译器开关用于签名字符,但在使用库函数时要小心.此外,char
旧版芯片上的签名会更慢.
编辑:我偶然发现了Debian Wiki上的一个很棒的页面.它主要涉及从旧的ARM ABI到EABI的移植,但提到的很多内容仍然适用于x86-> ARM.它还链接到关于结构对齐的一个很好的常见问题解答(虽然它对于ARMv6/v7来说并不完全正确).