【发布时间】:2017-03-10 12:14:42
【问题描述】:
在我的自定义 .zip 解压器中,我收到如下警告:
runtime error: load of misaligned address 0x7f280ffe875a for type 'const uint32_t', which requires 4 byte alignment
原因是 reinterpret_cast 到 uint32_t* 和相同的取消引用。我知道将memcpy 转换为uint32_t 可以解决问题,但我应该打扰吗?我在许多广泛使用的库(如 pixman、cairo、...)中看到了相同类型的警告。
【问题讨论】:
-
取决于 x86 上的 CPU 架构,您很可能可以摆脱它。在 ARM 上,它可能会陷入硬件陷阱。但是,您处于未定义行为领域,并且允许编译器假定您没有进行 UB,因此任何事情都可能发生。
-
不过pixman也可能用在arm国家。
-
我认为 UB 胜过所有关于 CPU 架构的讨论。我只把它作为我的第二点,因为上面只是一个简短的评论。
-
@user1095108: "但是 pixman 也可能在 arm 国家使用。" 如果有人尝试,它会在 ARM 国家爆炸。未对齐的读取不是您可以忽略的。
-
@NicolBolas 总是有手动 armv6+ 支持未对齐读取。 Pixman 由 cairo 使用,它包含针对它支持的每个平台的优化代码。我认为它知道它有能力打破 x86 上的规则,因为 arm 编译/链接了不同的代码。
标签: c++ memory-alignment type-punning