Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 22:38

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Speicherreservierung Sinnvoll? C++

Discussion on Speicherreservierung Sinnvoll? C++ within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
KingwondA's Avatar
 
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
Speicherreservierung Sinnvoll? C++

Ich gehe meinen Weg als Spieleprogrammierer (hobby) und in meinem Buch was ich lese wird erwähnt, dass es sinnvoll ist Instanzen, Variablen auf dem Heap anstatt auf dem Stack zu erzeugen/speichern.

Meine Frage nun: Bringt das Speichern auf dem Heap eine spürbare verbesserung?

Bis auf die Tatsache das ich die Größe eines Array nun zur Laufzeit angeben kann bringt mir dass speichern auf dem Heap doch nur ein paar taktzyklen an verbesserung.
KingwondA is offline  
Old 04/25/2014, 20:13   #2


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Wie meinst du "Speicher reservieren"?
MrSm!th is offline  
Old 04/26/2014, 11:41   #3
 
elite*gold: 1391
Join Date: Apr 2014
Posts: 77
Received Thanks: 14
Den Heap sollte man nur nutzen, wenn es auch wirklich noetig ist. Z.B. bei einer Verwaltung von grossen Mengen an Daten wie Gameobjekte.
Datensaetze, die nicht besonders gross sind oder ohnehin nur temporaer benoetigt werden, sollten auf dem Stack abgelegt werden.
Beim Stack hast du hierbei den Vorteil, dass die Allokierung beim Start einer Prozedur nicht Zeitaufwaendig ist, da der Stack ohne Fragmentierung weiter waechst.
Allokierst du einen Speicherbereich auf dem Heap, muss die Standardlib erstmal einen ausreichend freien Bereich auf dem Heap finden und reservieren, damit es nicht zu Kollisionen kommt. Dazu kommt, dass die Daten manuell wieder freigegeben werden muessen, was frueher oder spaeter zu Memorylecks fuehrt (jeder macht diese Fehler).

Grosse / dynamisch wachsende Datensaetze / verlinkte Listen: Heap
Kleine / temporaere Datensaetze / zeitkritisch: Stack
Actidnoide is offline  
Old 04/26/2014, 14:25   #4
 
KingwondA's Avatar
 
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
Quote:
Originally Posted by Actidnoide View Post
Den Heap sollte man nur nutzen, wenn es auch wirklich noetig ist. Z.B. bei einer Verwaltung von grossen Mengen an Daten wie Gameobjekte.
Datensaetze, die nicht besonders gross sind oder ohnehin nur temporaer benoetigt werden, sollten auf dem Stack abgelegt werden.
Beim Stack hast du hierbei den Vorteil, dass die Allokierung beim Start einer Prozedur nicht Zeitaufwaendig ist, da der Stack ohne Fragmentierung weiter waechst.
Allokierst du einen Speicherbereich auf dem Heap, muss die Standardlib erstmal einen ausreichend freien Bereich auf dem Heap finden und reservieren, damit es nicht zu Kollisionen kommt. Dazu kommt, dass die Daten manuell wieder freigegeben werden muessen, was frueher oder spaeter zu Memorylecks fuehrt (jeder macht diese Fehler).

Grosse / dynamisch wachsende Datensaetze / verlinkte Listen: Heap
Kleine / temporaere Datensaetze / zeitkritisch: Stack
Danke für die Antwort.

Wobei ich gerade gelesen habe, dass sogennante Memory Manager helfen sollen Memory-leaks zu finden.
Aber ich bin ganz Deiner Meinung:
Grosse / dynamisch wachsende Datensaetze / verlinkte Listen: Heap
Kleine / temporaere Datensaetze / zeitkritisch: Stack
KingwondA is offline  
Old 04/26/2014, 14:38   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Der Heap ist langsamer als der Stack, da wirst du wohl etwas falsch verstanden haben.

Du kommst aber nicht um ihn herum, denn du nimmst ihn immer, wenn du Dynamik brauchst, da der Stack gewissermaßen statisch ist (hast du ja schon an den Arrays erkannt).
Du brauchst dich aber selbst gar nicht wirklich mit dem Heap herumschlagen, das tun Klassen für dich. Die Standardlib bringt string für dynamische Zeichenketten, vector für dynamische Arrays und vieles mehr schon mit.

Das Ganze läuft nach dem RAII Prinzip, welches einfach gesagt lautet: Der Konstruktor fordert Speicher an, der Destruktor gibt ihn frei.
Speziell für Pointer gibt es auch noch die Smartpointer, die dieses Prinzip auch in die manuelle Speicheranforderung bringen, solltest du sie einmal brauchen. Damit sind Speicherlecks praktisch ausgeschlossen, denn selbst wenn du deine Daten nicht direkt auf dem sich selbst aufräumenden Stack hast, sind deren Verwaltungsobjekte auf dem Stack. Du musst dieses Prinzip nur konsequent durchziehen.

Grundsätzlich gilt: In deinem Code sollte nirgendwo new oder delete zu sehen sein, es sei denn es gibt einen verdammt guten Grund. Außerdem ist wann immer möglich der Stack direkt zu nutzen. Speicherung auf dem Heap wird durch Klassen gekapselt, deren Objekte wiederum auf dem Stack liegen.
MrSm!th is offline  
Old 04/26/2014, 15:03   #6
 
KingwondA's Avatar
 
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
Grundsätzlich gilt: In deinem Code sollte nirgendwo new oder delete zu sehen sein, es sei denn es gibt einen verdammt guten Grund. Außerdem ist wann immer möglich der Stack direkt zu nutzen. Speicherung auf dem Heap wird durch Klassen gekapselt, deren Objekte wiederum auf dem Stack liegen.

Ich Zitiere mal etwas aus dem Buch:

Fangen wir mit einem kleinen Rückblick zum Thema Stack und Heap an. Es wurde ja geklärt,
dass lokale Variablen auf dem Stack erzeugt werden. Diese werden gelöscht, nachdem der Gültigkeitsbereich, in dem sie erzeugt wurden, verlassen wird. Das hat den Nachteil, dass wir zum Beispiel Probleme bekommen, wenn wir innerhalb einer Funktion eine Instanz einer Klasse erzeugen, die aber nach Verlassen der Funktion weiterhin gültig sein soll. Globale Variablen kommen als Ausweg nicht infrage, also bleibt nur noch die Möglichkeit, die Klasseninstanz über den Rückgabewert an die aufrufende Funktion zu übergeben. Das ist allerdings recht zeitraubend, da wieder eine komplette Kopie der Instanz auf dem Stack abgelegt werden muss. Erschwerend kommt hinzu, dass man ja nur einen einzigen Rückgabewert zur Verfügung hat. Was bleibt also noch übrig? Nichts!
Oder? Moment, na ja, es gibt ja auch noch den Heap, hätte ich fast vergessen. Wenn man nun also Variablen oder Instanzen einer Klasse auf dem Heap statt auf dem Stack erzeugt, so werden diese nach dem Verlassen einer Funktion nicht mehr automatisch gelöscht. Sie behalten ihr Gültigkeit so lange, bis wir sie selbst wieder freigeben.

-Wichtig-
Daher ich noch ein newbie bin, kenne ich nur die Methoden die mir das Buch liefert, welches ich lese.
KingwondA is offline  
Old 04/26/2014, 15:20   #7
 
elite*gold: 1391
Join Date: Apr 2014
Posts: 77
Received Thanks: 14
Klar, wenn man ein lokales Objekt per Parameter an eine Funktion uebergibt oder als Rueckgabewert zurueckgibt, muss es kopiert werden, was natuerlich etwas mehr Zeit benoetigt.
Es ist aber auch moeglich, ein auf dem Stack liegendes Objekt per Referenz zu uebergeben (Genau wie man es mit dem Heap macht). Der Textausschnitt zeigt keinen wirklichen Geschwindigkeitvergleich zwischen Heap und Stack.

Ich nehme mal an das Buch behandelt auch Zeiger und Referenzen?
Actidnoide is offline  
Old 04/26/2014, 15:31   #8
 
KingwondA's Avatar
 
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
Quote:
Originally Posted by Actidnoide View Post
Klar, wenn man ein lokales Objekt per Parameter an eine Funktion uebergibt oder als Rueckgabewert zurueckgibt, muss es kopiert werden, was natuerlich etwas mehr Zeit benoetigt.
Es ist aber auch moeglich, ein auf dem Stack liegendes Objekt per Referenz zu uebergeben (Genau wie man es mit dem Heap macht). Der Textausschnitt zeigt keinen wirklichen Geschwindigkeitvergleich zwischen Heap und Stack.

Ich nehme mal an das Buch behandelt auch Zeiger und Referenzen?
Jop, die habe ich auch mit bravour bestanden.
KingwondA is offline  
Old 04/26/2014, 15:53   #9
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Entweder arbeitest du über die von MrSm!th erwähnten Smartpointer, oder du benutzt einen Compiler der den neuesten C++-Standard richtig umsetzt und gibst solche Objekte einfach mithilfe der neuen Move-Semantik zurück.
Wie weit das automatisch gemacht wird, muss dir aber jemand anderes sagen^^

Padmak
Padmak is offline  
Old 04/26/2014, 16:17   #10
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Objekt nicht dynamisch erstellen und einfach normal zurückgeben. RVO sollte meistens greifen, falls nicht gibt es noch die move semantics oder simples kopieren (was je nach Objekt wirklich kein Problem darstellt).
Falls du beim Testen merkst, dass genau diese Stelle der Flaschenhals ist, kann man nachbessern bzw den komplizierteren Weg gehen.
Schlüsselbein is offline  
Old 04/26/2014, 16:40   #11


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Quote:
Originally Posted by KingwondA View Post
Grundsätzlich gilt: In deinem Code sollte nirgendwo new oder delete zu sehen sein, es sei denn es gibt einen verdammt guten Grund. Außerdem ist wann immer möglich der Stack direkt zu nutzen. Speicherung auf dem Heap wird durch Klassen gekapselt, deren Objekte wiederum auf dem Stack liegen.

Ich Zitiere mal etwas aus dem Buch:

Fangen wir mit einem kleinen Rückblick zum Thema Stack und Heap an. Es wurde ja geklärt,
dass lokale Variablen auf dem Stack erzeugt werden. Diese werden gelöscht, nachdem der Gültigkeitsbereich, in dem sie erzeugt wurden, verlassen wird. Das hat den Nachteil, dass wir zum Beispiel Probleme bekommen, wenn wir innerhalb einer Funktion eine Instanz einer Klasse erzeugen, die aber nach Verlassen der Funktion weiterhin gültig sein soll. Globale Variablen kommen als Ausweg nicht infrage, also bleibt nur noch die Möglichkeit, die Klasseninstanz über den Rückgabewert an die aufrufende Funktion zu übergeben. Das ist allerdings recht zeitraubend, da wieder eine komplette Kopie der Instanz auf dem Stack abgelegt werden muss. Erschwerend kommt hinzu, dass man ja nur einen einzigen Rückgabewert zur Verfügung hat. Was bleibt also noch übrig? Nichts!
Oder? Moment, na ja, es gibt ja auch noch den Heap, hätte ich fast vergessen. Wenn man nun also Variablen oder Instanzen einer Klasse auf dem Heap statt auf dem Stack erzeugt, so werden diese nach dem Verlassen einer Funktion nicht mehr automatisch gelöscht. Sie behalten ihr Gültigkeit so lange, bis wir sie selbst wieder freigeben.

-Wichtig-
Daher ich noch ein newbie bin, kenne ich nur die Methoden die mir das Buch liefert, welches ich lese.
Das ist absoluter Unfug. Das Kopieren bei der Rückgabe zu vermeiden, indem man den Heap nutzt? Habe ich ja noch nie gehört. Da killt man den angeblichen Performancevorteil sowieso direkt wieder.
Wie Schlüsselbein schon sagt, jeder aktuelle Compiler optimiert unnötige Kopiervorgänge. Noch dazu gibt es seit C++11 Move-Semantics.
C++ ist nicht Java oder C#, wo (fast) alles nur eine Referenz auf das Objekt auf dem Heap ist. Das ist auch nicht notwendig. Dieser Mythos, in C++ würde zu viel kopiert, ist schon längst Geschichte.
Kauf dir am besten ein anderes Buch. Es enthält mindestens schon einmal veraltete Informationen, wenn nicht sogar falsche.
Quote:
Originally Posted by Actidnoide View Post
Klar, wenn man ein lokales Objekt per Parameter an eine Funktion uebergibt oder als Rueckgabewert zurueckgibt, muss es kopiert werden, was natuerlich etwas mehr Zeit benoetigt.
Es ist aber auch moeglich, ein auf dem Stack liegendes Objekt per Referenz zu uebergeben (Genau wie man es mit dem Heap macht). Der Textausschnitt zeigt keinen wirklichen Geschwindigkeitvergleich zwischen Heap und Stack.

Ich nehme mal an das Buch behandelt auch Zeiger und Referenzen?
Referenzen auf eine lokale Variable zurückgeben? Schlechte Idee, das ruft undefiniertes Verhalten hervor.
MrSm!th is offline  
Old 04/26/2014, 16:57   #12
 
elite*gold: 1391
Join Date: Apr 2014
Posts: 77
Received Thanks: 14
Ich sprach in dem Fall von einer Parameteruebergabe (ja, ging nicht ganz hervor)
Actidnoide is offline  
Old 04/26/2014, 18:35   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Achso, klar, bei Parametern und den meisten anderen Zuweisungen sind natürlich, außer bei primitiven Typen, wann immer möglich Referenzen zu bevorzugen
MrSm!th is offline  
Old 04/26/2014, 18:54   #14
 
KingwondA's Avatar
 
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
Hmm
Ich bin bei Kapitel 7 von 11.
Soll ich nun hier abbrechen und mir ein besseres Buch zu legen, oder die letzten 4 Kapitel noch zu ende machen, und dann ein neues Buch kaufen?

-Kapitel 7 fehlen mir nur noch 4 neu Sachen (Überschreiben von Memberfunktionen, Virtuelle Memberfunktionen, Vererbung und Performance, Statische Membervariablen), dann wäre ich bei Kapitel 8 und somit würden nur noch 3 Kapitel fehlen......-

Yeah 100 Beiträge ;D
KingwondA is offline  
Old 04/28/2014, 17:46   #15
 
elite*gold: 0
Join Date: Apr 2010
Posts: 2,832
Received Thanks: 4,152
Würde gern wissen wie es nach dem Zitat aus dem Buch weitergeht. Erscheint mir etwas auseinander "gerupft". :P

Würde das Buch trotzdem noch zuende lesen.
Elektrochemie is offline  
Reply


Similar Threads Similar Threads
PC aufrüsten sinnvoll?
12/01/2012 - Hardware Discussions / Questions - 23 Replies
Abend, überlege mir grade, ob ich meinen PC aufrüsten soll, bzw ob es sich überhaupt lohnen würde. Also ich würde gerne Spiele wie Fifa 13, evtl. auch NFS: MW, COD: BO2 (muss nicht unbedingt alles auf höchster Grafikstufe sein, aber auch nicht auf der niedrigsten..) spielen und bei Fifa am liebsten den PC an meinen TV anschließen. Joa, hier mal die Daten: - Windows 7 Home Premium - Intel Core i5-2320 3GHz - 6GB RAM - AMD Radeon HD 7450
Aikido > Sinnvoll?
10/10/2012 - Off Topic - 18 Replies
Yo. Was haltet ihr von Aikido? Die Meinungen dazu gehen ja ziemlich auseinander.. "Sowas kann man wenn es hart auf hart kommt nicht anwenden" und so weiter.... Gibt es hier zufällig auch nen paar Leute, die Aikido selbst lernen?
Upgrade sinnvoll?
07/30/2012 - Hardware Discussions / Questions - 14 Replies
Es tut mir leid wenn einige leute jetzt schon denken, das ich hier ein wenig post-farming betreibe oder einfach nur spamen will, aber ich habe wirklich ein problem Ich wollte mir eine gigabyte GTX 670 Windforce 3x zulegen diese würde meine alte Gigabyte Radeon hd 5850 ablösen meine sonstigen specs. sehen so aus: i 5-750 @ stock=2,67Ghz, mit Zalman cnps 7x Kingston Valueram 4Gb Gigabyte radeon hd 5850 480BeQuiet Netzteil
wow anfangen, sinnvoll?
11/23/2011 - World of Warcraft - 16 Replies
hallo wow Spieler. ICH hab mir am Wochenende wow gekauft und bereits vollständig installiert. heute lese ICH in Foren das wow schon TOT ist und das das spiel untergeht... ist an den Gerüchten was drann oder rentiert es sich mit wow an zu fangen? über genaue Beschreibungen der aktuellen wow Situation würde ICH mich sehr freuen ;)



All times are GMT +2. The time now is 22:38.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.