Frage zur Speicherreservierung von 2 dim. Arrays



  • @john-0 sagte in Frage zur Speicherreservierung von 2 dim. Arrays:

    und nicht unbedingt die performanteste Lösung.

    Das mit der Performance ist klar. Aber weder hat der Threadersteller das Wort "Matrix" im Eingangspost verwendet, noch fiel in irgendeiner Form die Anforderung "performant".

    Für mich war das nur ein typischer Anfängerthread, wo Hilfe gefragt war und kein "ich bin Doktor der Mathematik und will die Berechnung mit Matrizen revolutionieren, damit ich den Nobelpreis bekomme"-Thread. 😉



  • @john-0

    Ein std::vector ist kompatibel mit C-Funtionen.

    @john-0 sagte in Frage zur Speicherreservierung von 2 dim. Arrays:

    Der ganze 0/3/5-Rule Kram ist zwar formalistisch wichtig, aber für das Problem Matrizen in C++ nur Beiwerk.

    Das ist kein Beiwerk! Deine Matrixklasse erzeugt durch Kopieren UB.


  • Mod

    @manni66 sagte in Frage zur Speicherreservierung von 2 dim. Arrays:

    @john-0

    Ein std::vector ist kompatibel mit C-Funtionen.

    @john-0 sagte in Frage zur Speicherreservierung von 2 dim. Arrays:

    Der ganze 0/3/5-Rule Kram ist zwar formalistisch wichtig, aber für das Problem Matrizen in C++ nur Beiwerk.

    Das ist kein Beiwerk! Deine Matrixklasse erzeugt durch Kopieren UB.

    Volle Zustimmung. Die Rule of 0 besagt ja gerade, dass man dieses "Beiwerk" lieber dahin verschieben sollte, wo es hingehört. Wieso sollte eine Matrix Speicher verwalten? Das ist nicht ihre Aufgabe. Das hat gefälligst eine spezialisierte Speicherverwaltungsklasse zu übernehmen, die das dann auch richtig macht. Daher ist das wohl eine der wichtigsten Regeln in C++, kein Formalismus.



  • @SeppJ sagte in Frage zur Speicherreservierung von 2 dim. Arrays:

    Volle Zustimmung. Die Rule of 0 besagt ja gerade, dass man dieses "Beiwerk" lieber dahin verschieben sollte, wo es hingehört. Wieso sollte eine Matrix Speicher verwalten? Das ist nicht ihre Aufgabe. Das hat gefälligst eine spezialisierte Speicherverwaltungsklasse zu übernehmen, die das dann auch richtig macht. Daher ist das wohl eine der wichtigsten Regeln in C++, kein Formalismus.

    Der wichtigste Punkt überhaupt ist es, dass man Code möglichst wiederverwenden sollte und nicht Dinge implementiert, die andere deutlich besser gelöst haben. Die Frage bei einer Matrix Klasse ist nun was da schwerer wiegt, die Implementation der Speicherverwaltung oder die effiziente Umsetzung der Implementation von so Dingen wie die Matrizenmultiplikation. Wenn man sich das Paper von Goto und Geijn anschaut dürfte klar sein, was mehr Arbeit ist. D.h. die Speicherverwaltung ist das leichtere Problem.

    Der wichtigste Aspekt bei dem hier geschilderten Problem ist, wie man eine Matrix auf linearen Speicher abbildet. Also wie berechnet man aus zwei Indexvariablen den korrekten Index für den Speicherzugriff? Das ist bei einer Matrix das Wichtigste. Bei C++ muss man damit auch über die Row Major Order (die kommt man bei den statischen zweidimensionalen Felder zum Einsatz) sprechen, sprich wie sind die Elemente im linearen Speicher angeordnet.

    Weshalb sollte man in einer Matrix Klasse den Speicher selbst verwalten und kein std::vector nutzen? std::vector hat so einige Eigenschaften, die nicht unbedingt ideal für eine Matrix sind. std::array wäre, wenn es denn auf dem Heap angelegt würde und deine dynamische Größe haben könnte, die bessere Speicherklasse. So ist Matrix Klasse ähnlich fundamental anzusehen wie std::vector und müsste eigentlich Teil der Standardlibrary sein. Wenn es denn da nicht das Problem gäbe, dass in den letzten Revisionen der Standardlibrary immer mehr die Verwendung von Memory Allocatoren zu einem Problem geworden wäre, da sie nicht konsequent genutzt werden.



  • @manni66
    Ich habe das Codebeispiel so angepasst, dass klar sein dürfte, dass das nur ein Gerüst ist in die Funktionalität implementiert werden muss. Akzeptabel?



  • @john-0 sagte in Frage zur Speicherreservierung von 2 dim. Arrays:

    std::vector hat so einige Eigenschaften, die nicht unbedingt ideal für eine Matrix sind.

    Nenn doch mal konkret einige, dieser einigen nicht idealen Eigenschaften.



  • Kleine Anmerkung: Für Matrizen in C++ kann ich EigenLib empfehlen, hat auch schon SIMD Optimierungen mit drin, und ist recht umfangreich, und einfach einzubinden.



  • Oder Blitz++



  • Schön, dass wir es von einer einfachen Anfänger-Frage zum Verlinken eines wissenschaftlichen Papers und einer Diskussion über Memory-Allokatoren geschafft haben... Das wird dem Threadersteller bestimmt weiterhelfen.😀



  • @It0101
    Ist ja nicht so, dass am Anfang nicht auf die Frage eingegangen wurde. Was stört dich an einer Folgediskussion?


Anmelden zum Antworten