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

11

31.12.2012, 15:40

In Deinem Fall wäre also ganz schlicht

Quellcode

1
2
3
4
5
6
7
8
9
int main()
{
    std::vector<myClass> Array( size);
    
    Function(Array);
}

void Function(std::vector<myClass> &array)
{}
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.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

12

31.12.2012, 18:25

1. Sorry, ich hatte natürlich am Anfang gemeint:

C-/C++-Quelltext

1
std::vector<myClass> Vector


2. Der Vector wird erstellt und zu einem späterem Zeitpunkt ist mir die genaue Grösse bekannt. Deswegen verwende ich später dann das reserve(), damit direkt schonmal die Grösse(sobald sie bekannt ist) reserviert wird.

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

13

05.01.2013, 23:11

Hallöle.

Zitat

Reserve ändert die Vektorgröße nicht [...]
Oh, und wie es das tut. Allerdings merkt man nichts davon, da man so nur einen haufen Null-Objekte erhält, die zwar physisch da sind, für den Nutzer allerdings nicht existieren.

Zitat

Deswegen verwende ich später dann das reserve(), damit direkt schonmal die Grösse(sobald sie bekannt ist) reserviert wird.
Von std::vector<>#reserve kann man getrost die Finger lassen, sofern man nicht dutzende Aufrufe von std::vector<>#push_back vor hat. Schaden tut's allerdings nicht.

Wenn du ein simples C-Array verwendest, kannst du sorgenfrei die Größe als int32_t mit liefern. Die vier Bytes mehr auf dem Stack werden dein Programm nicht umbringen. Und wenn du schon deswegen bangst, kannst du die Funktion mit __attribute__((fastcall))/__fastcall (?) markieren. Dann werden beide Werte über Register übergeben, verschwenden ergo keine Zeit mit dem Stack. Solche Aufrufkonventionen machen allerdings Ärger bei DLLs und funktionieren nur bei statischen Funktionen.
Das nur noch mal, um zu verdeutlichen, dass std::array<>/std::vector<> nutzerfreundlicher sind. Die Geschwindigkeits-Unterschiede sollten zu vernachlässigen sein.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Horni

Frischling

Beiträge: 21

Beruf: Student MB

  • Private Nachricht senden

14

05.01.2013, 23:33

@Evrey

man sollte seine Antworten auf den Wissensstand des Fragenden anpassen ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

15

05.01.2013, 23:55

Hallöle.

Zitat

Reserve ändert die Vektorgröße nicht [...]
Oh, und wie es das tut. Allerdings merkt man nichts davon, da man so nur einen haufen Null-Objekte erhält, die zwar physisch da sind, für den Nutzer allerdings nicht existieren.

Mit anderen Worten: resize() ändert nicht die size(), sondern die capacity() des vectors... ;)

Wenn du ein simples C-Array verwendest, kannst du sorgenfrei die Größe als int32_t mit liefern.

Wenn dann besser ein std::array verwenden, "simple" Arrays sind leider nicht so simpel wie man meinen möchte...

Die vier Bytes mehr auf dem Stack werden dein Programm nicht umbringen. Und wenn du schon deswegen bangst, kannst du die Funktion mit __attribute__((fastcall))/__fastcall (?) markieren. Dann werden beide Werte über Register übergeben, verschwenden ergo keine Zeit mit dem Stack. Solche Aufrufkonventionen machen allerdings Ärger bei DLLs und funktionieren nur bei statischen Funktionen.

Abgesehen davon ist diese Syntax eine compilerspezifische Spracherweiterung und daher nicht portabel...

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

16

06.01.2013, 00:10

Mit anderen Worten: resize() ändert nicht die size(), sondern die capacity() des vectors... ;)

Nein. Resize ändert wirklich die Größe. Reserve ändert die Kapazität.

Zitat

Wenn du ein simples C-Array verwendest, kannst du sorgenfrei die Größe als int32_t mit liefern.

Wenn dann besser ein std::array verwenden, "simple" Arrays sind leider nicht so simpel wie man meinen möchte...

Da stimme ich zu. Eine konstante Referenz auf std::array und gut.
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.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schrompf« (06.01.2013, 11:35)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

06.01.2013, 01:11

Ah, ich meinte natürlich reserve...

Werbeanzeige