强制成员对齐SIMD数据类型

时间:2016-04-24 12:50:25

标签: c++ alignment simd

我有一个具有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)))

1 个答案:

答案 0 :(得分:0)

请检查:https://msdn.microsoft.com/en-us/library/dn736986.aspx Visual Studio有时会导致ARM处理器出现错误。