私はこのようになります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)))
を追加するよりも良い方法がありますか?
非標準の整列された属性ではなく、標準の 'alignas'指定子を使用するとどうなりますか? –
クラス全体ではなく、 'alignas'や' __attribute__'を 'uint32x4'自体に適用するのに役立ちますか?それがうまくいくならば、これは一般的にC++のほうがよいでしょう。私は仮想メンバーの関数ポインタがクラスのレイアウトの前または後ろにあるかどうかを忘れていますが、最初に来ると、仮想メンバー関数を持つクラスの他のメンバーの配置に影響します。 –
'alignas'は' __attribute__'と同じ効果があります。 'uint32x4'に追加しても効果はありません – shoosh