Was sind die Merkmale von C-Programmiersprache, die die Typ-Sicherheit zu brechen und verhindert, dass praktische Garbage Collection zur Sprache hinzugefügt werden? Erklären. Erstens verstehe ich nicht die Beziehung zwischen Typ-Sicherheit und Garbage Collection. Ich würde mich freuen, wenn mir jemand dabei helfen könnte.Beziehung zwischen Typ Sicherheit und Praxistauglichkeit von Garbage Collection
Antwort
Sie können tun Garbage Collection in C. Es heißt conservative garbage collection. Der Trick besteht darin, alle Daten, die wie ein Zeiger aussehen, so zu behandeln, als ob es tatsächlich ein Zeiger wäre, und keinen Speicher zurückzufordern, der durch ihn erreichbar ist. Es gibt zwei Probleme: Zum einen können Sie Daten nicht verschieben (dh Komprimierung), da die Ungewissheit, ob etwas, das wie ein Zeiger aussieht, tatsächlich ein Zeiger ist. Wenn Sie also auf einen neuen Speicherort zeigen, kann dies zu Datenkorruption führen). Das Typ-Sicherheitsproblem besteht darin, dass es für einen C-Programmierer möglich ist, einen Zeiger auf ein int zu speichern, eine Mathematik auszuführen und dann den Zeiger wiederherzustellen (wie in: ptrdiff_t d = (ptrdiff_t) ptr; ptr = NULL; d += 42; /* GC here would be bad */ d -= 42;
). Dieses Verbergen des Zeigers könnte zu einem konservativen Müll führen collector, um Speicher, der nur über diesen Zeiger erreichbar war, vorzeitig zurückzugewinnen.
Vielen Dank für die ausführliche Antwort. Erstens war es für mich nicht klar, da ich mich nicht an den Typ Casting erinnerte. – Moonwild
Eigentlich ist die Situation noch schlimmer. Ein 100% legitimes C-Programm könnte wiederholt einen großen Teil des Speichers belegen und auffüllen, einen Zeiger darauf speichern in einer Union mit 'unsigned char [sizeof (void *)]', den Inhalt dieses Arrays ausgeben (wahrscheinlich in hex) die Konsole und überschreiben alle Spuren dieses Zeigers. Es könnte dann, nachdem es dies einige Male getan hat, eine Sequenz von Hexadezimalziffern akzeptieren, die zuvor erwähnte Vereinigung verwenden, um sie in einen Zeiger zurück zu konvertieren und den Inhalt des dadurch identifizierten Speichers anzuzeigen. Da der C-Standard erfordert, dass Zeiger solange gültig bleiben, wie ... – supercat
... Daten, die ausreichen, um das zugrundeliegende 'char []' wieder herzustellen, * überall * gespeichert werden und es nicht einmal benötigt wird, * innerhalb des Computers * zu sein, es wäre in vielen Fällen unmöglich für eine C-Implementierung zu bestimmen, ob ein bestimmter Zeiger noch existiert (es könnte eine solche Bestimmung für Zeiger vornehmen, die niemals einem Aliasnamen für "unsigned char" zugeordnet wurden, aber dies würde GC für irgendeinen Zeiger ausschließen jemals "memcpy" ausgesetzt worden sein). – supercat
Es gibt keine Beziehung zwischen Typ Sicherheit und Garbage Collection überhaupt. Zum Beispiel gibt es eine Sprache, die Ada genannt wird (heutzutage nicht sehr beliebt), die sehr typsicher ist, aber keinen Garbage Collector aufweist. Zur gleichen Zeit ist Javascript eine dynamische Sprache (d. H. Keine Typsicherheit überhaupt), hat aber in den meisten Implementierungen einen Garbage Collector.
- 1. AutoCloseable und Garbage Collection Beziehung
- 2. Querverweise und Garbage Collection
- 3. Unterschied zwischen Hintergrund und gleichzeitige Garbage Collection?
- 4. Garbage Collection und Strings
- 5. Garbage Collection
- 6. nodejs garbage collection output
- 7. Rx-Subskriptionen und Garbage Collection
- 8. Background Worker und Garbage Collection?
- 9. Numpy und matplotlib Garbage Collection
- 10. Java Garbage Collection und null
- 11. Garbage Collection von unclosed Scanner
- 12. Android - Erfassen von Garbage Collection
- 13. Hardware Assisted Garbage Collection
- 14. Java Garbage Collection Zeit?
- 15. THREE.js webGL Garbage Collection
- 16. Garbage Collection vs. gemeinsame Zeiger
- 17. Unity3D: Garbage Collection optimieren
- 18. Garbage Collection in Perl
- 19. Garbage Collection in bash
- 20. requestAnimationFrame Garbage Collection
- 21. Garbage Collection in CGO
- 22. Python-Threads Garbage Collection
- 23. java garbage collection
- 24. Forcing Garbage Collection
- 25. asp.net Garbage Collection Benachrichtigungen
- 26. Java kurzlebige Objekte & Garbage Collection
- 27. .NET Garbage Collection und Native Threads
- 28. Garbage Collection in Python und Referenzzählung
- 29. Java Garbage Collection und temporäre Objekte
- 30. Prism Ansicht Injection Presenter und Garbage Collection
Wie würde der Garbage Collector den Unterschied zwischen einem Zeiger auf ein Objekt und einem zufälligen Bit Speicher kennen, der zufällig denselben Wert hält? –
Das ist genau der Punkt! Also die Lösung ist konservative Sammlung zu verwenden! – Moonwild