我正在为ipad程序编写一个文件加载器,我得到了奇怪的EXC_BAD_ACCESS异常.这是一段简短的代码,我认为是错误的原因:
float testFloat() {
char mem[32];
char *charPtr = &mem[0];
float *floatPtr = (float*)(charPtr + 1);
float f = *floatPtr; //EXC_BAD_ACCESS
return f;
}
Run Code Online (Sandbox Code Playgroud)
只有当charPtr的偏移量不能被4整除时才会发生错误,所以我猜它可能与ARM CPU上的指针对齐有关.
你是对的,这是由于指针对齐.在许多RISC系统上,对齐需要至少与数据类型本身一样大.(ARM属于这一类.)
在这种情况下,float是4个字节,因此地址需要与4个字节对齐.(可被4整除)
此外,这种类型的惩罚违反了严格别名.
在x86系统上,内存访问并不总是必须对齐 - 但是对于未对齐的访问通常会有性能损失.
| 归档时间: |
|
| 查看次数: |
1076 次 |
| 最近记录: |