2dim Array zu 1dim Array
-
Hallo,
ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?
-
MatrixHack schrieb:
Hallo,
ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?
float packed[4][4]; float * linearized = &packed[0][0];Dann hast Du allerdings kein
float[16], sondern einfloat*. Sollte es einfloat[16]sein müssen, dann musst Du kopieren.
-
Ist denn garantiert, dass das float[16] linear im Speicher liegt?
Quasi, dass es diese Struktur hat:
[0][0], [0][1], [0][2], [0][3], [1][0], [1][1], ...
?
-
oder mit einer doppelten for-Schleife:
int counter = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { newFloat[counter] = oldFloat[i][j]; counter++; } }Macht im Grunde genommen keinen Unterschied im Bezug auf die Geschwindigkeit. Hast nur mehr Zeilen Code.
-
MatrixHack schrieb:
Hallo,
ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?
float x[4][4]; float (&y)[16] = reinterpret_cast<float(&)[16]>( x );Und ja, das Ganze ist wohldefiniert.
-
camper schrieb:
MatrixHack schrieb:
Hallo,
ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?
float x[4][4]; float (&y)[16] = reinterpret_cast<float(&)[16]>( x );Und ja, das Ganze ist wohldefiniert.
Wieso das & Zeichen?
-
also referenz auf das 4x4 array
---> alles was du im [16]-array änderst, hat auch wirkung auf das 4x4 array
-
MatrixHack schrieb:
camper schrieb:
MatrixHack schrieb:
Hallo,
ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?
float x[4][4]; float (&y)[16] = reinterpret_cast<float(&)[16]>( x );Und ja, das Ganze ist wohldefiniert.
Wieso das & Zeichen?
Die schnellste Variante ist nunmal, gar nichts zu tun, und einfach nur eine Referenz auf das ursprüngliche ARray zu verwenden.
-
camper schrieb:
MatrixHack schrieb:
camper schrieb:
MatrixHack schrieb:
Hallo,
ich habe ein float[4][4] und moechte das konvertieren in ein float[16]. Was ist da die schnellste Variante?
float x[4][4]; float (&y)[16] = reinterpret_cast<float(&)[16]>( x );Und ja, das Ganze ist wohldefiniert.
Wieso das & Zeichen?
Die schnellste Variante ist nunmal, gar nichts zu tun, und einfach nur eine Referenz auf das ursprüngliche ARray zu verwenden.
Das selbe haette ich doch auch hiermit:
float * linearized = &packed[0][0];Ein float* waere fuer mich genauso ok wie float[16].
-
das größte problem bei all dem (sowohl referenz als auch pointer) ists sowieso, dass der flaschenhals die lebensdauer des 4x4 array ist...