016
25.07.2003, 14:28 Uhr
ao
(Operator)
|
Zitat: |
~Marian postete @0xdeadbeef: Ich benutze Windows ME (am anfang schnell. Mit der Zeit aber sch****)
|
Meinst du damit, wenn es einen Tag lang läuft, ist es langsamer als wenn es frisch gebootet ist?
jetzt hör ich euch schon wieder geiern: "Windows ME einen ganzen Tag lang laufen lassen??? Buaahaaahaaa, der glaubt wohl auch an den Osterhasen!"
Im Ernst, wenn die Geschwindigkeit nachläßt, kann das an einem Speicherleck liegen, und bei so was fällt mein erster Verdacht auf Applikationen, nicht aufs Betriebssystem. Ich habe schon ewig nicht mehr vor einem 9x- oder ME-System gesessen, gibts da eigentlich auch einen Taskmanager, der den Speicherverbrauch anzeigen kann? Solltest du mal prüfen.
Zitat: |
@ao: Wo reserviert denn malloc und realloc den Speicher? Ich dachte das wäre der Stack. Kommt es dann nicht wieder irgendwann zu einem Overflow? Ich glaube ich muss mich unbedingt mehr mit Registern und dem ganzen Kram beschäftigen...
|
Nein, auf dem Stack liegen nur die lokalen Objekte:
C++: |
int glob; void bla (int x, float y) { int a; char name [64]; char *dynamicname = malloc [1000]; }
|
Hier liegen x, y, a und name auf dem Stack. Der Compiler kann sie auch in Registern halten, muß er aber nicht, und das ist für dich auch nicht unterscheidbar. Stackvariablen werden beim Betreten der Funktion angelegt und beim Verlassen nach außen (d.h. per return) automatisch wieder zerstört. Ein Aufrufen innerer Funktionen gilt hier nicht als Verlassen; die Stackvariablen überdauern das und sind nach der Rückkehr aus der inneren Funktion noch gültig.
glob liegt im globalen Datensegment und der Speicher, auf den dynamicname zeigt, befindet sich auf dem Heap (dem Speichervorrat, den das Betriebssystem verwaltet). dynamicname selbst ist lokal und liegt damit ebenfalls auf dem Stack.
Globale Daten leben so lange, wie das Programm läuft und werden von der Laufzeitumgebung spätestens bis zum Betreten von main angelegt und frühestens nach dem Verlassen von main aufgeräumt. Heapvariablen bleiben solange gültig, bis sie vom Programm explizit freigegeben werden (mit free(), wenn der Speicher mit malloc geholt wurde, und mit delete, wenn er mit new geholt wurde). Wenn das Programm das vergißt, bleibt der Speicher zugewiesen und ist verloren.
Manche Betriebssysteme (auch Windows, soweit ich weiß) geben beim Beenden eines Programms allen Speicher frei, den dieses noch belegt hatte, räumen also hinter dem Programm auf. Aber darauf darf man sich als Programmierer nicht verlassen; das Vergessen von free ist in jedem Fall ein Programmierfehler.
ao |