Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Unterschiede in Char Speicherreservierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.06.2007, 05:08 Uhr
~sd78d7d
Gast


hi,

ich würde gerne wissen was der unterschied zwischen

char test[255];

und

char *nocheiner = new char[255];

beim letzteren muss man ja ein "delete []nocheiner;" am ende der funktion schreiben damit der speicher wieder freigegeben wird. aber wann wird der speicher vom ersteren freigegeben? gibt es empfehlungen wann man was davon einsetzen soll?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.06.2007, 07:48 Uhr
Kest
saint


Hi!

Bei

C++:
char test[255];

werden 255 char's auf dem Stack angelegt, d.h., sie existieren so lange, bis das Ende ihres Gültigkeitsbereichs erreicht ist. Und erst beim Eintreten des Gültigkeitsbereich werden sie errichtet.

Bei

C++:
char *nocheiner = new char[255];

werden 255 char's auf dem Heap angelegt, d.h., sie existieren so lange, bis sie explizit mit >delete< zerstört werden. (Außer man hat so 'ne Art automatische Speicherbereinigung. Wie z.B. >garbage collection< bei Java)
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.06.2007, 05:13 Uhr
~sd78d7d
Gast


ich hab jetzt noch nen bissle rumgelesen ..

auf diversen seiten stand das der stack eine art block ist der vom OS für meine anwendung vom hauptspeicher abgezweigt wurde. er soll recht schnell sein aber in seiner speichergröße beschränkt sein.

wie gross ist denn so ein speicherblock?

dort stand auch das wenn man mehr bräuchte würde das system einen weiteren block oder so zur verfügung stellen. gibt es grenzen bei der speicherreservierung beim stack? zb.

C++:
char EinGanzesBuch[90500];
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.06.2007, 10:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,
also der Visual Studio Compiler hat als Standardgröße für den Stack glaub ich inzwischen 10MB oder so. Das lässt sich natürlich anders einstellen - jedoch reserviert er die maximale Stackgröße direkt beim Programmstart - d.h das kann dann einige Zeit dauern. der Heap wird halt stück für stück alloziiert
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.06.2007, 14:52 Uhr
0xdeadbeef
Gott
(Operator)


Naja, das Alloziieren auf dem Stack ist nun nicht besonders aufwändig, wenn man nicht gerade eine Debug-Version ausliefert, die stack guards und vergleichbaren Kram einbaut - der Kernel muss halt ein paar Pages anfordern, und das Programm einen Zeiger setzen.

Prinzipiell ist die Größe des Stacks lediglich beschränkt durch den virtuellen Adressraum - auf 32bit-Maschinen also 2GB, suf 64bit-Maschinen, wenn ich mich da grad nicht verrechne, 8 Exabyte - allerdings muss natürlich schon genug physischer Speicher dafür vorhanden sein. Der Stack wächst halt einfach nach unten.

Etwas komplexer wird es, wenn man multithreadet - weil man dann im Stack-Adressraum mehrere Threadstacks unterbringen muss. Ich weiß, dass Java per Default Threadstacks von 1MB Größe anlegt und die untereinander wegschichtet, das heißt, wenn du da über den einen Stack hinausschreibst, landest du irgendwann im anderen. Das hat mir schonmal ziemliches Kopfzerbrechen im Zusammenhang mit einer C-Bibliothek und dem JNI verursacht . Wie Windows das macht, müsste ich jetzt nachkucken.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.06.2007 um 14:53 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.06.2007, 15:03 Uhr
Kest
saint


Nicht so genau, auch Stack wird Stück für Stück dazu alloziert.
Also PE files haben im Header dafür zwei Einträge: >size of stack reserve> und >size of stack commit<. >size of stack commit< bedeutet, wie viel Speicher es für das Programm noch vor dem Start, also während der Initalisierung bereitgestellt wird; >size of stack reserve< bedeutet, wie viel Speicher das Programm maximal benötigen könnte. Wenn also >size of stack commit< nicht mehr ausreicht, wird der restliche Speicher: "size of stack reserve" - "size of stack commit" dazu alloziert. Natürlich wenn das dann nocht geht. ist ja auch nicht unbegrenz. Z.B wenn es so viel Speicher, wie >size of stack commit< verlangt, nicht gibt, wird das Programm erst gar nicht gestartet.
Mit dem Heap ist das genau so.
Ja, maximal ist 2 GB. Aber so viel zu kriegen, dürfte schon ziemlich schwer sein.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.06.2007, 15:08 Uhr
Kest
saint


Also, bei mir geht grad maximal 512 MB.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: