iOS 设备是否允许未对齐的内存访问?
Is unaligned memory access allowed on iOS devices?
我目前正在开发一个应用程序,该应用程序加载紧密打包的数据 blob,其中包含可能未正确对齐的不同整数类型(大小从 char 到 int)。
那么,我可以使用简单的 *(short*)ptr
或类似的方式访问该数据吗?在我的 iphone 5 上测试表明没有问题,但我不确定所有新处理器上的所有情况。
我确实找到了一些相关资料,像这样:
ARMv6 and later, except some microcontroller versions, support unaligned accesses for half-word and single-word load/store instructions with some limitations, such as no guaranteed atomicity.
但是对于单词,似乎在 32 位和 64 位 ARM 上相应地是 32 位和 64 位单词,这意味着短需要在 64 位机器上正确对齐。
所以,我可以假设这是安全的,还是我应该使用像 __packed
这样的关键字?
或者我应该完全避免它并重新创建我的数据以便它始终具有正确的对齐方式(或者当数据来自外部源并且不能被永久修改时始终使用 memmove)?
很久以前我就试过了。它起作用了,但是每次访问未对齐的内存都会导致陷阱,这需要花费大量时间。我建议您衡量添加一百万条对齐的短裤与添加一百万条未对齐的短裤需要多长时间。如果您有数百或数千个未对齐的数字,则无需担心。
__packed 工作得相当快。 ARM 有一些聪明的指令可以用很少的指令进行未对齐访问。同样,我会测量这需要多长时间。我在这方面的经验不是最新的。
我目前正在开发一个应用程序,该应用程序加载紧密打包的数据 blob,其中包含可能未正确对齐的不同整数类型(大小从 char 到 int)。
那么,我可以使用简单的 *(short*)ptr
或类似的方式访问该数据吗?在我的 iphone 5 上测试表明没有问题,但我不确定所有新处理器上的所有情况。
我确实找到了一些相关资料,像这样:
ARMv6 and later, except some microcontroller versions, support unaligned accesses for half-word and single-word load/store instructions with some limitations, such as no guaranteed atomicity.
但是对于单词,似乎在 32 位和 64 位 ARM 上相应地是 32 位和 64 位单词,这意味着短需要在 64 位机器上正确对齐。
所以,我可以假设这是安全的,还是我应该使用像 __packed
这样的关键字?
或者我应该完全避免它并重新创建我的数据以便它始终具有正确的对齐方式(或者当数据来自外部源并且不能被永久修改时始终使用 memmove)?
很久以前我就试过了。它起作用了,但是每次访问未对齐的内存都会导致陷阱,这需要花费大量时间。我建议您衡量添加一百万条对齐的短裤与添加一百万条未对齐的短裤需要多长时间。如果您有数百或数千个未对齐的数字,则无需担心。
__packed 工作得相当快。 ARM 有一些聪明的指令可以用很少的指令进行未对齐访问。同样,我会测量这需要多长时间。我在这方面的经验不是最新的。