未对齐的内存访问是否总是导致总线错误?

use*_*818 9 c memory-alignment

根据维基百科页面分段错误,未对齐的内存访问可能导致总线错误.本文提供了有关如何触发总线错误的示例.在该示例中,我们必须启用对齐检查以查看总线错误.如果我们禁用这种对齐检查怎么办?

该程序似乎正常工作.我有一个程序经常访问未对齐的内存,并且它被很多人使用,但没有人向我报告总线错误或其他奇怪的结果.如果我们禁用对齐检查,未对齐内存的副作用是什么?

平台:我正在开发x86/x86-64.我也通过在Mac上用"gcc -arch ppc"编译它来尝试我的程序,它运行正常.

Pav*_*aev 13

  1. 访问未对齐的内存可能要慢得多(例如,慢几倍).

  2. 并非所有平台都支持未对齐访问 - 例如x86和x64,但ia64(Itanium)不支持.

  3. 编译器可以模拟未对齐的访问(例如,VC++为__unaligned在ia64上声明的指针执行此操作) - 通过插入附加检查来检测未对齐的情况,以及加载/存储分别跨越对齐边界的对象的部分.然而,这比在原生支持它的平台上的未对齐访问更慢.

  • 您还可以添加#4,操作系统可以通过捕获处理器异常并修复它来模拟应用程序的未对齐访问(类似于页面错误的情况).这比编译器在生成的代码中执行未对齐的修复更慢.Windows可以在ia64中支持此功能. (6认同)
  • 这个答案在博客文章中引用*[数据对齐速度:神话还是现实?](http://lemire.me/blog/archives/2012/05/31/data-alignment-for-speed-myth-or -现实/)*. (6认同)
  • 甚至还有一个非对齐数据的反例,它可以将尽可能多的内容推入CPU缓存中以避免缓存错误:http://danluu.com/3c-conflict/太糟糕了,那里没有评论部分,因为我想要听听别人对此的看法.想在某个时候自己测试一下.当然这取决于处理器架构. (2认同)
  • @leetNightshade这篇文章非常有趣和实用.但正如我所看到的,它没有谈到与读取大小相关的对齐意义上的未对齐数据.它讨论了与高速缓存相关的对齐,这种对齐发生在更高的地址位中.为了可视化,32位地址包括:TTTT TTTT TTTT TTTT TTTT SSSS SSXX XYYY然后当前问题只讨论Y而不是其他.没有人关心谈论X和T,而你提到的非常有趣的文章只讨论S.只是为了补充评论,S位的长度取决于缓存大小和缓存级别当然 (2认同)

Jam*_*son 5

这在很大程度上取决于芯片架构.x86和POWER非常宽容,Sparc,Itanium和VAX抛出了不同的例外.

  • 它确实取决于处理器.我最近开发了一个DSP,当被要求操作未对齐的存储器地址时,它将很乐意继续使用最接近的对齐存储器地址.Debug*that*,你变态未访问的内存访问个人. (7认同)