Du bist nicht angemeldet.

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

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

21

28.11.2012, 21:39

Ich finde ja eher, das wäre ein Fall für std::vector. Der macht nämlich genau das, nur noch mit ein paar Fehlerchecks.

Quellcode

1
std::vector<int> my_stuff( 1234, wunschWert);
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

22

28.11.2012, 22:08

Entweder war Dots Post ein Scherz oder es geht ihm darum, dass niemand die größe Nachträglich ändern kann. Quasi ein Vector ohne Resize, Erase, Pop und Push.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

28.11.2012, 22:48

[...] oder es geht ihm darum, dass niemand die größe Nachträglich ändern kann. Quasi ein Vector ohne Resize, Erase, Pop und Push.

Bingo ;)

24

28.11.2012, 23:38

Ein std::vector hat einen minimalen Mehraufwand bei dem Zugriff auf ein Element.

Moment, wieso? Klar, im Debugbuild sind alle Range-Checks drin, aber im Releasemode sollte der Elementzugriff über den [] genauso schnell wie bei jedem Array sein. Die Mehrkosten sind eher auf der Speicherseite, wo neben ein paar Zusatzinfos insbesondere noch Speicher für zukünftige Elemente schonmal reserviert ist.
Lieber dumm fragen, als dumm bleiben!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

25

28.11.2012, 23:42

Der vector bedeutet eine zusätzliche Indirektion.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

26

29.11.2012, 00:33

Ein std::vector hat einen minimalen Mehraufwand bei dem Zugriff auf ein Element.

Moment, wieso? Klar, im Debugbuild sind alle Range-Checks drin, aber im Releasemode sollte der Elementzugriff über den [] genauso schnell wie bei jedem Array sein. Die Mehrkosten sind eher auf der Speicherseite, wo neben ein paar Zusatzinfos insbesondere noch Speicher für zukünftige Elemente schonmal reserviert ist.

Bei statischen Arrays weiss der Compiler bereits wo der Speicher ist (das offset muss natürlich noch berechnet werden) und daher muss nicht zuerst noch die Adresse geladen werden.
Pseudo Assembler (irgendwelche misch-masch Syntax ^^):
Statischer Zugriff:

Quellcode

1
mov %eax, (DIREKTE_ADRESSE)


Dynamischer Zugriff:

Quellcode

1
2
mov %ebx, (%ecx) 
mov %eax, (%ebx)

Im ersten Beispiel kann die Adresse direkt berechnet werden. Das offset kann auch direkt beim lade Befehl mitgebeben werden (üblicherweise).
Im zweiten Beispiel muss zuerst die Adresse des Zeigers aus der Variable, auf welche mit ecx zugegriffen werden kann (in dem Beispiel). Diese Adresse ist dann das eigentliche Ziel und wird benutzt um den eigentlichen Wert in eax zu laden.

Das teure hier ist das laden vom Speicher, welcher auf RAM zugreifen muss. Die Berechnung der Offsets ist praktisch gratis (irgendwo bei 1-4 Cycles, während der Speicherzugriff IIRC ein paar hundert kosten kann).

27

29.11.2012, 02:02

Ok, das macht Sinn. Ist dann aber bei dynamischen Arrays das selbe, oder nicht?
Lieber dumm fragen, als dumm bleiben!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

28

29.11.2012, 02:19

Davon habe ich ja geredet.. Zur Laufzeit verhalten sich dynamische Arrays gleich wie std::vector und statische Arrays wie std::array. Die STL Klassen sind im Grunde ja nichts anderes als Wrapper um statische, respektive dynamische Arrays.

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

29

29.11.2012, 20:19

Von std::unique_ptr für dynamische Arrays muss ich abraten: Das ist undefined behavior, da unique_ptr delete zum Löschen benutzt, für ein dynamisches Array aber delete[] benutzt werden muss. Als ersatz kann man boost::scoped_array oder eben gleich std::vector nehmen.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

30

29.11.2012, 21:19

Von std::unique_ptr für dynamische Arrays muss ich abraten: Das ist undefined behavior, da unique_ptr delete zum Löschen benutzt, für ein dynamisches Array aber delete[] benutzt werden muss. Als ersatz kann man boost::scoped_array oder eben gleich std::vector nehmen.

Nein. std::unique_ptr ist durchaus in der Lage zwischen dynamischen Arrays und einfachen Objekten zu unterscheiden. Habe gerade keine Zeit das mit Referenz auf den Standard zu referenzieren, aber das steht auch in den gängigen Online Referenzen.
http://en.cppreference.com/w/cpp/memory/unique_ptr

Werbeanzeige