未对齐的内存访问是否总是导致总线错误?
根据Wikipedia页面Segmentation fault ,未对齐的内存访问可能导致总线错误。 本文提供了有关如何触发总线错误的示例。 在示例中,我们必须启用对齐检查以查看总线错误。 如果我们禁用这种对齐检查怎么办?
该程序似乎正常工作。 我有一个程序经常访问未对齐的内存,很少有人使用它,但没有人向我报告总线错误或其他奇怪的结果。 如果我们禁用对齐检查,未对齐内存的副作用是什么?
平台:我正在开发x86 / x86-64 。 我也通过在Mac上用“gcc -arch ppc”编译它来尝试我的程序,它运行正常。
-
访问未对齐的内存可能会慢得多(例如,慢几倍)。
-
并非所有平台都支持未对齐访问 – 例如x86和x64,但ia64(Itanium)不支持。
-
编译器可以模拟未对齐的访问(例如,VC ++为在ia64上声明为
__unaligned
指针执行此操作) – 通过插入附加检查来检测未对齐的情况,以及加载/存储分别跨越对齐边界的对象的部分。 然而,这比在原生支持它的平台上的未对齐访问更慢。
这在很大程度上取决于芯片架构。 x86和POWER非常宽容,Sparc,Itanium和VAX抛出了不同的例外。
考虑我刚刚在ARM9上测试的以下示例:
//Addresses 0 1 2 3 4 5 6 7 8 9 U8 u8Temp[10] = {0x11,0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x00}; U32 u32Var; u32Var = *((U32*)(u16Temp+1)); // Let's read four bytes starting from 0x22 // You would expect that here u32Var will have a value of 0x55443322 (assuming we have little endian) // But in reallity u32Var will be 0x11443322! // This is because we are accessing address which %4 is not 0.