2016-04-24 5 views
2

Ich habe eine Klasse mit einer NEON SIMD-Datentyp, der wie folgt aussieht:Erzwingen Mitglied Ausrichtung eines Daten SIMD-Typ

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

mit Klirren für ARM kompilieren, wenn ich diese laufen auf den meisten Android-Geräten, es ist einfach funktioniert gut. Bei einigen Geräten jedoch clear() Ursachen SIG_BUS, Ausrichtung Fehler und wahr genug anrufen, wenn ich die Adresse m_d überprüfen schaltet es auf 16 Bytes nicht ausgerichtet heraus (die Größe von uint32x4, wie es sollte)
Die Lösung wurde hinzugefügt:

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

dies in der Tat die meisten der Fälle gelöst, wo Change auf eigene instanziert wird, aber es hat nicht solche Fälle lösen:

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

Wenn Something Änderung Instanziieren w würde wieder eine Adresse bekommen, die nicht ausgerichtet ist. In diesem Fall löste das erneute Hinzufügen von __attribute__((aligned(16))) zu Something es aber eine beunruhigende Problem löst
- ist die Ausrichtungserklärung in nicht übertragen auf Something?
- Gibt es einen besseren Weg, dies zu tun, als nach allen Orten zu suchen Change wird instanziiert und __attribute__((aligned(16))) hinzufügen?

+1

Was passiert, wenn Sie den standardmäßigen "alignas" -Spezifizierer und nicht die nicht standardmäßige "aligned" -Attribuit verwenden? –

+0

Hilft es oder hat irgendeine Wirkung, ein "alignas" oder "__attribute__" auf das "uint32x4" selbst anzuwenden, anstatt auf die Klasse als Ganzes? Wenn es funktioniert, könnte dies im Allgemeinen besser für C++ sein. Ich vergesse, wenn virtuelle Elementfunktionszeiger an die Vorder- oder Rückseite des Layouts einer Klasse gehen, aber wenn sie an erster Stelle stehen, beeinflussen sie die Ausrichtung anderer Member für Klassen mit virtuellen Memberfunktionen. –

+1

'alignas' hat die gleiche Wirkung wie' __attribute__'. das Hinzufügen auf dem 'uint32x4' hat keine Wirkung – shoosh

Antwort