Speicherverwaltung
-
matti83 schrieb:
ich will nur wissen ob es aufm Stack ist oder nicht.
Geht nicht. Braucht man aber auch nicht.
Es ist vorallem deshalb nicht moeglich, weil der Speicher ja aus einem anderen Thread kommen koennte - von dem weisst du ja nicht wie das Speicherlayout aussieht. Was man zB sehr wohl machen kann, ist herausfinden ob diese adresse auf dem aktuellen thread stack liegt - nur bringt das eben wenig info (da der Speicher ja auch von irgendwo anders kommen kann).
Da es aber vollkommen uninteressant ist wo der Speicher liegt, gibt es unterschiedliche Moeglichkeiten und Wege zu dem Ziel zu kommen dass du hast. Deshalb sollten wir darueber reden was du damit erreichen willst.
Als Beispiel:
Jemand will erreichen dass alle Objekte die per new angelegt werden auch wieder geloescht werden wenn die memberfunktion release() aufgerufen wird.Dann wuerde man entweder erzwingen dass diese Objekte nur ueber eine bestimmte Funktion generiert werden koennen (named constructor idiom). Dadurch ist es einfach zu garantieren dass das Objekt immer auf Variante A erstellt wurde. release() weiss daher wie es sich selbst loeschen kann.
Es gibt hier wahnsinnig viele Moeglichkeiten die unterschiedlichsten Sachen zu erreichen...
-
Ich will alle Objekte die auf einem ThreadStack liegen ROT markieren
-
Shade Of Mine schrieb:
Es ist vorallem deshalb nicht moeglich, weil der Speicher ja aus einem anderen Thread kommen koennte - von dem weisst du ja nicht wie das Speicherlayout aussieht. Was man zB sehr wohl machen kann, ist herausfinden ob diese adresse auf dem aktuellen thread stack liegt - nur bringt das eben wenig info (da der Speicher ja auch von irgendwo anders kommen kann).
in dem Moment, indem das Objekt erstellt wird, kann es doch nur in einem Thread sein... und genau der Thread prüft, ob es auf dessen Stack liegt!?
Also kann der Speicher doch nicht von irgendwo anders kommen...
-
matti83 schrieb:
Ich will alle Objekte die auf dem Stack liegen ROT markieren
Stack Objekte einfach verbieten, dann liegt alles am free store. Fertig. Kein Objekt muss rot markiert werden.
Willst du Hilfe haben oder nicht?
-
matti83 schrieb:
in dem Moment, indem das Objekt erstellt wird, kann es doch nur in einem Thread sein... und genau der Thread prüft, ob es auf dessen Stack liegt!?
Also kann der Speicher doch nicht von irgendwo anders kommen...
Doch, der Speicher kann von ueberall herkommen.
Stell dir mal folgendes vor:
template<typename T> T* create(void* memory) { return new(memory)T(); }
Das objekt wird erstellt, aber der Speicher kann von ueberall herkommen.
-
Shade Of Mine schrieb:
matti83 schrieb:
Ich will alle Objekte die auf dem Stack liegen ROT markieren
Stack Objekte einfach verbieten, dann liegt alles am free store. Fertig. Kein Objekt muss rot markiert werden.
Willst du Hilfe haben oder nicht?
Klar will ich Hilfe haben. Sonst wäre ich nicht hier.
Ich benötige aber StackObjekte, eben weil ich sie ROT markieren möchte... das sind die Objekte, von denen ich alle anderen Objekte ansprechen will... aber es soll eben auch HeapObjekte geben können.
Ich seh schon... du willst mir sagen, das ich zwei unterschiedliche PointerKlassen brauche. Pointer die nur auf dem Stack liegen und Pointer die nur im Heap sind. Aber wenn ich genau drüber nachdenke... wie soll ich das gewährleisten?
-
Meine Güte, man kann echt stur sein. Wenn du tatsächlich Hilfe willst, geh bitte auf die Antworten ein. Jeder hat bis jetzt gesagt, dass die Unterscheidung Stack/Heap im Allgemeinen unsinnig ist. Das wurde inzwischen x-mal erwähnt. Im verlinkten Thread stehts auch noch in jedem zweiten Post. Aber du weisst es natürlich besser.
Wenn du wenigstens eine brauchbare Begründung hättest, könnte man ja noch darüber reden. Aber du willst Objekte "ROT markieren". Schlimm sowas...
-
Verstehe ich nicht... jetzt geht es nicht. Aber wenn ich eine Begründung hätte, warum ich es machen will, dann geht es?
Sehr komisch....
Will hier doch auch niemanden angreifen oder beleidigen. Ich will nur zwischen Stack und Heap Objekten unterscheiden... aber anscheinend geht das nicht.
Meine Begründung hab ich doch geschrieben... und das Argument, dass etwas nicht sinnvoll ist zieht bei mir nicht.
Wenn ich endlich eine Lösung gefunden habe, werde ich sie hier posten. Es sei denn ihr kommt mir zu vor
-
matti83 schrieb:
Verstehe ich nicht... jetzt geht es nicht. Aber wenn ich eine Begründung hätte, warum ich es machen will, dann geht es?
Nein. Es geht nicht.
Aber es gibt viele Lösungen für viele Probleme. Die Problemstellung "Objekte Rot markieren" gibt es nicht, da man Objekte nicht rot markieren kann.
Man kann zB memory Statistiken erstellen, man kann Objekte auf den Stack oder auf den Free Store zwingen. Je nachdem was die Aufgabenstellung ist, gibt es viele Lösungen.
Bedenke: nur weil das Objekt zB auf dem Stack liegt, muss es ja noch lange nicht auch automatisch zerstört werden. Die Unterscheidung Stack/Free Store zu machen ist deshalb nicht möglich und nicht sinnvoll. Auch wenn nicht sinnvoll bei dir nicht zieht - bedenke dass wir immer auch "nicht möglich" dazu sagen. Das nicht sinnvoll sagen wir deshalb dazu, weil es mit sehr großer Wahrscheinlichkeit eine Lösung für dein Problem gibt. Nur dazu musst du uns verraten was du tun willst.
Du willst nicht nur objekte Rot markieren. Du willst damit ja etwas erreichen. Und die Frage ist was das ist. Du hast anfangs geschrieben einen GC zu machen: da gibt es viele Ansätze wie man einen funktionierenden GC machen kann.
Deshalb ist es für uns wichtig zu wissen WAS du machen willst, nicht WIE. Denn dein WIE klappt nicht. Aber das heisst eben auch noch lange nicht dass dein WAS nicht klappt.
Die Unterscheidung Stack/Free Store klappt zB auch deshalb nicht, weil es nicht klar ist was Stack und was Free Store ist wenn du mit mehreren Prozessen hantierst. Denn fremder Speicher ist fremder Speicher. Egal WO er liegt. Thread internen Stack ist ja herausfindbar (auch wenn es dann noch lange nicht bedeutet dass das Objekt automatisch zerstört wird nur weil es auf dem Stack liegt).
-
okay - geht also nicht. schade.
dann muss ich also zwei klassen bauen - eine darf nur auf dem heap erstellt werden und die andere darf nur auf dem stack erstellt werden. und der benutzer muss sich darum kümmern.
dann geh ich davon aus, dass alle StackKlassen auch auf dem Stack sind.