I
[qoute="Der aus dem Westen..."]Rüschpeckt. Du bist gut. [/qoute]
Danke, ist einfach nur meine Meinung
[qoute="Der aus dem Westen..."]
Eigentlich ist der Heap ja auch der Hauptspeicher. Ah, das geht sehr weit in die Windowsprogrammierung rein.
Wenn du deine Anwendung startest, wird erst einmal ein Prozess gestartet. Dieser Prozess bekommt seine 4 GB an vir. Speicher und einen eigenen Heap. Muss ich so nennen, obwohl es eigentlich nur einen Heap gibt, aber in Windows kann man nun mal mehrere Heaps verwalten. Heap ist englisch, bedeutet "Halde" oder "Haufen", und das Konzept dahinter ist auch recht logisch. Es gibt einen globalen Heap für den Prozess, auf den jeder Thread zugreifen kann (mit der Win-API-Funktion [url)http://msdn.microsoft.com/en-us/library/windows/desktop/aa366569%28v=vs.85%29.aspx]GetProcessHeap[/url] ), und du kannst auch noch weitere Heaps erstellen, in denen du dann deine Sachen speicherst. Allerdings geschleunigt dies die Fragmentierung im virtuellen Adressraum, sodass der Kernel irgendwann meldet, dass für dein Prozess kein Speicher mehr übrig ist, selbst wenn im physikalisch vorhanden Speicher noch Platz für mindestens fünf chinesische Großstädte ist.[/qoute]
Achso. Warum aber verwendet man einen Heap?
Deine Vergleiche sind episch: " selbst wenn im physikalisch vorhanden Speicher noch Platz für mindestens fünf chinesische Großstädte ist. "
[qoute="Der aus dem Westen..."]
Der Stack ist da anders. Mit deinem Prozess bekommst du automatisch auch einen Thread (main, WinMain,_tmain und wie sie nicht alle heißen - ich persönlich verwende nur main oder WinMain), den dein Prozess abarbeitet. Du kannst weitere Thread erstellen lassen (vom OS, C++ definiert nativ keine Threads, oder zumindest noch nicht - ich meine, gehört zu haben, dass sich dies mit dem Standard C++11 ändert, aber sicher bin ich mir nicht), welche dann Code ausführen. Jeder Thread verfügt über einen eigenen Stack, und auf den Stack anderer Threads sollte man möglichst nicht zugreifen. Wenn man es schafft, das Programm so zu schreiben, dass die Threads weitestgehend unabhängig voneinander arbeiten können, ohne dass Thread A Thread B in irgendwelche Variablen reinfuscht (wie gesagt, da kein Teil des Standards, muss man sich hier auf die Funktionen des OS verlassen), ist die Anwendung Threadsicher. Bei jedem Prozess bekommst du also einen Heap und bei jedem Thread einen eigenen Stack zur Verfügung gestellt.[/qoute]
Jetzt klärt sich das schon wieder mit dem letzten Satz
Man lernt nie aus
[qoute="Der aus dem Westen..."]
Ich habe etliche PE-Exen mit Hex-Editoren, die dafür ausgelegt waren, Maschinencode zu interpretieren (HIEW) und Disassemblern (IDA) geöffnet. Ich meine, mich zu erinnern, dass die ersten 0x1000 Bytes Headerdaten beinhalten (ist allerdings nicht fix - das PE-Format ist recht dynamisch, je nachdem, was du später alles im Speicher haben willst), dann kommt ein Adresssprung, und plötzlich bin ich bei 0x00401000 oder um den Dreh. Aber gut ... ich habe ja gesagt, dass die Sachen statisch im Stack oder in den Datensegmenten stehen. [/quote]
Stimmt.
[qoute="Der aus dem Westen..."]
Es war ein Adressbereich, der dynamisch erstellt wurde, richtig? [/qoute]
Auf jeden Fall danke ich Allen, die Geholfen haben mein Problem zu lösen,
und sage auf Wiedersehen, bis zu meinem nächsten Problem