2016-04-24 9 views
2

私はこのようになりますNEON SIMDデータ型を持つクラスを持っている:私は、これはほとんどのAndroidデバイス上で実行すると、ARMのための打ち鳴らすを使用してコンパイルするSIMDデータ型のメンバーのアライメントを強制

class Change { 
    void clear() { 
     m_d = vdupq_n_s32(0); 
    } 
private: 
    uint32x4 m_d;  
}; 

、それだけで正常に動作します。一部のデバイスで しかしclear()を呼び出すと、私はm_dのアドレスをチェックするとき、それは解決策を追加した16バイト(uint32x4の大きそれが必要のような)
に整合していないが判明し、SIG_BUS、アライメントフォルトと、十分な真の原因:

class Change { 
    void clear() { 
     m_d = vdupq_n_s32(0); 
    } 
private: 
    uint32x4 m_d;  
} __attribute__((aligned(16))); 

これは確かにChangeが独自にインスタンス化された例のほとんどを解決しますが、それは次のように事件を解決していない:Something変更ワットをインスタンス化する場合

class Something { 
    void* m_ptr; 
    Change m_change; 
}; 

ouldは再度整列していないアドレスを取得します。この場合、再度__attribute__((aligned(16)))を追加するとSomethingが解決されますが、問題が発生します
- Changeのアラインメント宣言がSomethingに転送されていませんか?
- これを行うには、Changeがインスタンス化されていて、すべて__attribute__((aligned(16)))を追加するよりも良い方法がありますか?

+1

非標準の整列された属性ではなく、標準の 'alignas'指定子を使用するとどうなりますか? –

+0

クラス全体ではなく、 'alignas'や' __attribute__'を 'uint32x4'自体に適用するのに役立ちますか?それがうまくいくならば、これは一般的にC++のほうがよいでしょう。私は仮想メンバーの関数ポインタがクラスのレイアウトの前または後ろにあるかどうかを忘れていますが、最初に来ると、仮想メンバー関数を持つクラスの他のメンバーの配置に影響します。 –

+1

'alignas'は' __attribute__'と同じ効果があります。 'uint32x4'に追加しても効果はありません – shoosh

答えて

関連する問題