2016-04-24 82 views
2

我有一個看起來像這樣的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)))

+1

如果使用標準'alignas'說明符而非非標準'aligned'屬性,會發生什麼? –

+0

它是否有幫助或有任何效果應用'alignas',或'__attribute__'到'uint32x4'本身,而不是整個類?如果可行,這對於C++來說可能會更好。我忘記了虛擬成員函數指針是在類的佈局的前面還是後面,但是如果它們先到達,它們將影響其他成員與具有虛擬成員函數的類的對齊。 –

+1

'alignas'與'__attribute__'具有相同的效果。在uint32x4上添加它沒有任何作用 – shoosh

回答