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?
Was passiert, wenn Sie den standardmäßigen "alignas" -Spezifizierer und nicht die nicht standardmäßige "aligned" -Attribuit verwenden? –
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. –
'alignas' hat die gleiche Wirkung wie' __attribute__'. das Hinzufügen auf dem 'uint32x4' hat keine Wirkung – shoosh