我有一个具有NEON SIMD数据类型的类,如下所示:
class Change {
void clear() {
m_d = vdupq_n_s32(0);
}
private:
uint32x4 m_d;
};
使用clang for ARM编译,当我在大多数Android设备上运行它时,它运行正常。
在某些设备上,但是调用clear()
导致SIG_BUS,对齐错误并且足够真实,当我检查m_d
的地址时,它结果未对齐到16个字节(uint32x4
的大小应该是)
解决方案是添加:
class Change {
void clear() {
m_d = vdupq_n_s32(0);
}
private:
uint32x4 m_d;
} __attribute__((aligned(16)));
这确实解决了Change
单独实例化的大多数情况,但它没有解决像:
class Something {
void* m_ptr;
Change m_change;
};
实例化Something
更改时,会再次获得未对齐的地址。在这种情况下,再次向__attribute__((aligned(16)))
添加Something
解决了它,但它引发了一个令人不安的问题
- Change
中的对齐声明不是转移到Something
吗?
- 有没有比这更好的方法来寻找所有地点Change
实例化并添加__attribute__((aligned(16)))
?
答案 0 :(得分:0)
请检查:https://msdn.microsoft.com/en-us/library/dn736986.aspx Visual Studio有时会导致ARM处理器出现错误。