我有一個看起來像這樣的NEON SIMD數據類型的類:強制執行SIMD數據類型的成員對齊
class Change {
void clear() {
m_d = vdupq_n_s32(0);
}
private:
uint32x4 m_d;
};
使用鐺爲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)))
?
如果使用標準'alignas'說明符而非非標準'aligned'屬性,會發生什麼? –
它是否有幫助或有任何效果應用'alignas',或'__attribute__'到'uint32x4'本身,而不是整個類?如果可行,這對於C++來說可能會更好。我忘記了虛擬成員函數指針是在類的佈局的前面還是後面,但是如果它們先到達,它們將影響其他成員與具有虛擬成員函數的類的對齊。 –
'alignas'與'__attribute__'具有相同的效果。在uint32x4上添加它沒有任何作用 – shoosh