3 Stimmen

Typ-Aliasing und dynamisch zugewiesene Arrays

Ich versuche, die automatische Vektorisierung durch den Compiler in der Array-Bibliothek von blitz++ zu erleichtern. Aus diesem Grund möchte ich eine Ansicht der Array-Daten, die in Brocken von Vektoren fester Länge, die bereits gut vektorisiert sind, präsentieren. Ich kann jedoch nicht herausfinden, was die Typ-Aliasing-Regeln in Verbindung mit dynamisch zugewiesenen Arrays bedeuten.

Hier ist die Idee. Ein Array besteht derzeit aus

T_numtype* restrict data_;

Die Operationen werden in einer Schleife über diese Daten ausgeführt. Ich möchte eine alternative Sicht auf dieses Array als Array von TinyVector<T_numtype, N> der ein Vektor fester Länge ist, dessen Operationen mit Hilfe der Ausdrucksvorlagen vollständig vektorisiert werden. Die Idee ist, dass ein Array der Länge L entweder sein sollte T_numtype[L] o TinyVector<T_numtype, N>[L/N] . Gibt es eine Möglichkeit, dies zu bewerkstelligen, ohne gegen die Regeln für die Typisierung zu verstoßen?

Für ein statisch zugewiesenes Array würde man Folgendes tun

union {
  T_numtype data_[L];
  TinyVector<T_numtype, N>[L/N];
};

Am ehesten kann ich mir vorstellen, dass die Definition

typedef union {
  T_numtype data_[N];
  TinyVector<T_numtype, N>;
} u;
u* data_;

und ordnen Sie es dann mit

data_ = new u[L/N];

Aber es scheint, dass ich jetzt mein Recht aufgegeben habe, mich an die gesamte Array als ein flaches Array vom Typ T_numtype, so dass ich, um auf ein bestimmtes Element zuzugreifen, Folgendes tun müsste data_[i/N].data_[i%N] was sehr viel komplizierter ist.

Gibt es also eine Möglichkeit, rechtlich eine Vereinigung von T_numtype data_[L] y TinyVector<T_numtype, N>[L/N] wobei L eine dynamisch bestimmte Größe ist?

(Ich bin mir bewusst, dass es zusätzliche Ausrichtung Bedenken, d.h. N muss ein Wert, der die gleiche wie die Ausrichtung des TinyVector Mitglied ist, sonst gibt es Löcher in das Array sein).

0voto

Cubbi Punkte 44766

Aliasing ist schwer zu legalisieren. Wenn jedoch einige "Operationen durch Schleifen über diese Daten durchgeführt werden", erfordern diese Operationen, dass diese Daten genau ein Array vom Typ T_numtype sind?

Es kann besser sein, die Daten in eine Klasse mit einem Datenelement des Typs zu verpacken TinyVector<T_numtype, N>[L/N] oder sogar std::vector<TinyVector<T_numtype, N> > da L anscheinend zur Laufzeit bestimmt wird, und stellen ein Paar Iteratoren für die Operationen zur Verfügung, die eine Schleife über die gesamten Daten als eine einzige Sequenz ausführen wollen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X