Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Jetzt verstehe ich, dir ging es immer nur darum, dass es rein theoretisch möglich ist die Länge zu verändern und man es darum nicht verwenden soll.
Bis auf dass er sich selbst die grösser merken muss (schlechtes Design, Eigenschaften eines 'Objekts' werden ausserhalb gelagert) und auch viel mehr aufpassen muss mit den Indizes.Wenn der Threadersteller überhaupt nur ein Array statischer Größe haben will, wäre ein stinknormales sf::Color[40][11] übrigens wohl die beste Lösung.
Naja auch nicht ganz richtig vector Mechanismen werden sehr wohl auf dem Stack gespeichert, nur die Daten halt nicht, doch ich denke es macht hier nun wirklich bald mal keinen Sinn mehr zu diskutieren was nun schneller ist, denn am Ende wird das Ganze dann doch vom OS entschieden und wer weiss wie dieses sich in allen Fällen und unter allen möglichen Umständen verhält.
Interessante Anmerkung noch: Wenn der Speicher eines vectors bei der Initialisierung alles auf einmal alloziert wird, so wird der Speicherbereich in den meisten Fällen ebenfalls kontinuierlich sein. Klar dies ist nicht garantiert aber es zeigt halt, wieso es in den meisten Fällen nicht sehr tragisch ist 2D vectoren zu verwenden, auch wenn sie halt die Möglichkeit bieten sich selbst zu vergrössern/verkleinern und dies nicht direkt gewollt ist.
Hier ein kleines Beispiel, der erste Part zeigt was man alles komische mit der Array Definition im Standard anstellen kann und zeigt gleichzeitig, dass der Speicher fortlaufend ist und der zweite Teil gibt die Adressen eines vectors aus, womit man sieht, dass dieser Speicher ebenfalls kontinuerlich alloziert wird (aber nicht garantiert ist!).
Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von »dot« (10.08.2012, 17:22)
Community-Fossil
Chill down.
Nein, ich meinte nicht explizit dich. Außerdem war das auch ein bisschen ironisch gemeint. Also ich führe selbst auch gerne solche Diskussionen in anderen Bereichen.Tut mir leid, wenn du den Eindruck hattest, dass ich angespannt wär. Ich führ solche Grundsatzdiskussionen gern, weil ich immer was dabei lernen kann. Das ganze war eigentlich nicht so direkt an dich gerichtet...
Interessant dieses extent template struct, aber ist wohl eher eine Symptom Bekämpfung wie eine Lösung, ist aber natürlich am richtigen Ort durch aus notwendig und sicherlich besser als das C idiom, welches ja nicht type-safe ist.Nicht unbedingt, denn da es sich um ein Array statischer Größer handelt, gehört die Größe natürlich zum Typ. Aber gut, noch besser wäre dann also ein std::array.
Naja gut alle Container haben das Problem eines underflow oder overflow, von daher muss man überall gleich aufpassen. Mit std::vector<T> hätte man natürlich noch die Möglichkeit .at() zu verwenden, jedoch hat das natürlich auch wieder seine Nachteile.Wieso er mit den Indices "viel mehr" aufpassen muss, ist mir allerdings nicht ganz klar.
Das ist mal wieder etwas légere formuliert, zumindest ist es für mich nicht wichtig wie 'angenehm' Speicher ausgelegt wird, sondern ob es technisch gesehn Sinn macht, wie du eben noch angefügt hast, dass verschiedene APIs es so verlangen.Wieso mir der zusammenhängende Speicherbereich wichtig ist, hat in erster Linie ebenfalls wieder nicht unbedingt mit der Performance zu tun. Es ist einfach eine sehr angenehme Eigenschaft und sehr oft einfach notwendig. Z.B. wenn ich meine multidimensionalen Daten an irgendeine API übergeben will, z.B. Bilddaten oder Matritzen an Direct3D/OpenGL...
Ja das ist klar und bei der kleinsten Änderung der vectoren kann sich alles verschieben.Das sieht nur auf den ersten Blick so aus. Wenn man genauer hinschaut, fällt auf, dass die Speicherblöcke zwar in der Tat hintereinander alloziert wurden, die Daten aber nicht zusammenhängend sein können, da die Differenz zwischen den Adressen 18 Byte beträgt und 18/8 keine natürliche Zahl ist. Wir haben also eine interne Fragmentierung von 2 Byte pro Block. Wenn du mit dem verschachtelten vector das gleiche Spielchen anstellst wie davor mit dem Array, wirst du hochinteressante Ergebnisse bekommen...
Ja war für mich zumindest sehr lehrreich.Chill down.
Tut mir leid, wenn du den Eindruck hattest, dass ich angespannt wär. Ich führ solche Grundsatzdiskussionen gern, weil ich immer was dabei lernen kann. Das ganze war eigentlich nicht so direkt an dich gerichtet...
Naja ich würde jetzt dies Klasse auch nicht direkt empfehlen, oder noch ein paar Dinge ändern. Z.B. ist die resize() Funktion ziemlich problematisch, weil du einfach das Array vergrösserts, aber die Elemente selbst nicht umher schiebst, d.h. wenn du jetzt ein 4x4 Feld hast und es auf 16x16 erweiterst, dann werden die 4x4 Felder plötzlich alle auf einer Zeile stehen. Gut vielleicht ist das ein gewünschter Effekt, aber meinstens wohl eher nicht. Ausserdem, wieso initialisierst du den vector nicht direkt in der Initialisierungsliste mit der passenden Grösse, nur um dann später resize() aufzurufen?Ich hab noch einen improvisierten 2d Vector aus einem alten Projekt. Er ist zwar nicht perfekt oder fertig, wird aber für deine zwecke völlig ausreichend sein.
http://pastebin.com/uHU0Gw3w
Einfach iin einen Header kopieren und benutzen.
Community-Fossil
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (11.08.2012, 17:58)
Zum Zeitpunkt seines Posts war die Diskussion noch längst nicht fertig und seine plumpige Antwort à la "Eure Diskussion ist schwachsinn und ich weiss alles besser: std::array" würde ich schon als getrolle bezeichnen (auch die zwei Edits zeigen, dass er nur schnell etwas hingeschrieben hat anstatt sich die Diskussion durchgelesen hat). Hätte er versucht sich in die Diskussion einzuklinken und mit std::array eine gute Alternative vorgeschlagen, hätte das Ganze etwas anderst ausgesehen.In erster Linie ging es um die Klärung der Frage des TE. Eure Diskussion ist eig. ziemlich ausgeufert (jedenfalls denke ich mal wusste der TE oft nicht worum es gerade geht) und insofern hat idontknow keineswegs destruktive Beitrage verfasst -> somit auch kein "getrolle" betrieben.
Das hab ich schon verstanden, ich dachte nur ich weise auf die groberen Mägel hin, anstatt nur zu sagen, dass es nicht perfekt.Was ist an "improvisiert", "alt", "nicht perfekt", "nicht fertig" und "reicht für seine Zwecke" so schwer zu verstehen?
Community-Fossil
Das hab ich schon verstanden, ich dachte nur ich weise auf die groberen Mägel hin, anstatt nur zu sagen, dass es nicht perfekt.Was ist an "improvisiert", "alt", "nicht perfekt", "nicht fertig" und "reicht für seine Zwecke" so schwer zu verstehen?
Werbeanzeige