【发布时间】:2015-04-12 03:44:45
【问题描述】:
一些 CPU 架构(x86 除外)非常不喜欢在未对齐的地址读取和写入多字节数,以至于在检测到这一点时会引发 SIGBUS 异常,并迫使程序员按字节顺序手动执行所有操作。虽然对于需要此操作的平台可能无能为力,但在允许未对齐访问的平台(例如 x86)上检查对齐并执行字节操作将是愚蠢的。问题是:C/C++ 编译器是否定义了一个指示对齐要求的常量?
目前,我正在使用这个:
#if defined(_M_IX86) | defined(__i386) | defined(__i386__) | defined(i386) | defined(_X86_)
// Unaligned access is allowed.
#elif defined(_M_X64) | defined(__x86_64__) | defined(__x86_64) | defined(__amd64) | defined(__amd64__) | defined(_M_AMD64)
// Unaligned access is allowed.
#else
#define ALIGNED_ACCESS_ONLY
#endif
但它看起来太“自制”了:它并没有说明当前硬件平台的实际属性,而只是描述了我自己对 x86-32 和 x86-64 以及这些平台最流行的常量名称的考虑。
【问题讨论】:
-
显而易见的解决方案是在尝试未对齐访问时捕获
SIGBUS... -
@black 我想这将是 heavy:即使捕获硬件异常很快(我强烈怀疑),无论如何安装处理程序,捕获错误并删除处理程序永远不会像简单地检查地址对齐然后相应地分支一样快。在我的情况下,非对齐访问是主要的操作模式,而不是罕见的情况。
-
确实如此;我只是为此提出了“穷人解决方案”。您能否告诉我们您只是想知道这一点还是您正在尝试解决特定问题XY?
-
@black 除了从缓冲区读取/写入数字和其他原始对象之外,绝对没有隐藏任务,可能会根据需要即时更改字节顺序。
-
"在允许非对齐访问的平台(例如 x86)上检查对齐并执行字节操作会很愚蠢" 真的很愚蠢吗?我知道 x86 允许未对齐的访问,但我认为当您实际执行未对齐的访问时会付出巨大的性能损失,因此避免它们并不一定看起来很愚蠢。如果这些值经常不对齐,那么逐字节解决方案将是可移植的,并且性能可能不会更差。
标签: c portability platform memory-alignment