Hilfe bei OOP - Seite 4

 
Vasiliy Sokolov #:

Offiziell, ja. Inoffiziell deutet vieles darauf hin, dass es sie gibt:

  • In MQL gibt es keine Zeiger. Stattdessen werden sie durch etwas ersetzt, das ihnen sehr ähnlich sieht.
  • In MQL gibt es keine direkte Speicherzuweisung, wie z.B. in C;
  • Programme in MQL werden von einer bestimmten virtuellen Maschine ausgeführt. Renat hat darüber nur kurz und nicht ein einziges Mal geschrieben;
  • Es kann eine Klasseninstanz definiert werden, die automatisch freigegeben wird. Es gibt also einen Mechanismus, der diese Instanzen überwacht und sie bei Bedarf freigibt. Was ist das, wenn nicht ein Müllsammler?
  • Alle Instanzen, die durch einen Zeiger initialisiert und nicht ordnungsgemäß freigegeben werden, werden beim Beenden als durchgesickerte Objekte markiert. Ihre Anzahl und die Gesamtgröße des verlorenen Speichers werden ausgedruckt. Ein Programm mit ausgelaufenem Speicher wird nicht einmal in Market validiert. Damit sind alle Objekte, auch die manuell zugewiesenen, erfasst, bekannt und dem System bekannt. Dies ist eine der klassischen Aufgaben, die die Müllabfuhr löst.

Es gibt ein hinreichendes und umfassendes Indiz dafür, dass es in emcool keinen Müllsammler gibt - Löschen ist nach Neuem Pflicht.

 
Dmitry Fedoseev #:

Es gibt ein hinreichendes Indiz dafür, dass es in emcool keinen Müllsammler gibt - Löschen ist nach Neuem Pflicht.

Soweit ich mich erinnere, hat einer der Entwickler eingeräumt, dass es eine Müllabfuhr gibt. Aber für den Benutzer existiert sie "irgendwie nicht".

Nun, was das neu-gelöschte Paar angeht - ich bin dafür. Im Allgemeinen müssen die Objekte, die Ressourcen angefordert haben, für diese verantwortlich sein. Es gibt Ausnahmen, wie z.B. die "Objektfabrik" - dort wird aber ausdrücklich davon ausgegangen, dass die Verantwortung für die erstellten Objekte bei demjenigen liegt, der diese Objekte bei der Fabrik angefordert hat.

Ich mag die Situation in Sprachen nicht, in denen es etwas Neues gibt und das Löschen nicht erforderlich ist, da "das System unnötige Dinge entfernt". Dies kann nicht nur die Leistung verringern (wenn überflüssige Objekte noch nicht entfernt wurden), sondern auch den Programmierer entlasten, da er sich nicht um die Folgen seines Handelns kümmern muss.

 
Georgiy Merts #:

Ich mag die Situation in den Sprachen wirklich nicht, in denen "neu" vorhanden ist, aber "löschen" nicht erforderlich ist, weil das System "Unnötiges" entfernt. Dies kann nicht nur die Leistung verringern (wenn überflüssige Objekte noch nicht entfernt wurden), sondern auch den Programmierer entlasten, da er sich nicht um die Folgen seines Handelns kümmern muss.

Andererseits wird die Produktivität im Allgemeinen verbessert. Die manuelle Entfernung nimmt viel Zeit im Hauptstrang in Anspruch. + Die Löschung erfolgt Element für Element. Vergleichen Sie z. B. die beiden Versionen des Skripts in diesem Thread. Der Geschwindigkeitsunterschied beträgt mehrere Male. Auch die Speichereffizienz steigt. Denn die Müllabfuhr bewegt Gegenstände, die miteinander verdichtet sind. Wenn Sie es manuell verwalten, entstehen freie Speicherlöcher, die nicht so einfach wiederverwendet werden können. Außerdem arbeitet der Garbage Collector in einem anderen Thread. Grundlegende Zeit wird nicht verschwendet. Alles in allem: ein Plus.

 
Vasiliy Sokolov #:

Die Produktivität hingegen wird im Allgemeinen gesteigert. Die manuelle Entfernung nimmt im Hauptstrom sehr viel Zeit in Anspruch. + Die Löschung erfolgt Element für Element. Vergleichen Sie z. B. zwei Versionen des Skripts in diesem Thread. Der Geschwindigkeitsunterschied beträgt mehrere Male. Auch die Speichereffizienz steigt. Denn die Müllabfuhr bewegt Gegenstände, die miteinander verdichtet sind. Wenn Sie es manuell verwalten, entstehen freie Speicherlöcher, die nicht so einfach wiederverwendet werden können. Außerdem arbeitet der Garbage Collector in einem anderen Thread. Grundlegende Zeit wird nicht verschwendet. Alles in allem ist das nur ein Pluspunkt.

Vasily, es tut mir leid, aber Sie verstehen überhaupt nicht, worüber Sie zu sprechen versuchen. Überhaupt nicht und in keiner Weise.

Lesen Sie wenigstens bei Wikipedia nach, was ein Müllsammler ist. Seine Hauptbesonderheit besteht darin, dass er Objekte entfernt, mit denen die Kommunikation verloren gegangen ist.

Nur dass er in diesem Fall als Müllsammler bezeichnet würde. Diese beiden Drehbücher stammen aus einer anderen Geschichte. Das Geschenk Gottes ist nicht mit einem Ei zu verwechseln.

Und warum sollte ein Garbage Collector plötzlich die Produktivität steigern? Es ist ein weiteres Polster zwischen dem nützlichen Code und der Hardware, und kein schwaches noch dazu.

 
Georgiy Merts #:

Soweit ich mich erinnere, hat einer der Entwickler zugegeben, dass es einen Müllsammler gibt. Aber für den Nutzer ist es "irgendwie weg".

///

Dies muss der "Garbage Collector" sein, der am Ende der Arbeit eine Meldung über ein Speicherleck ausgibt.

Vielleicht löscht es sogar verlassene Objekte. Aber selbst wenn sie beseitigt werden, gibt es eine große

Unterschied - sie werden erst am Ende des Auftrags gelöscht. Und wenn in einem mehrtausendfachen Zyklus neue Objekte geschaffen werden?

neue Objekte? Das Programm ist nicht funktionsfähig, da nicht genügend Speicher vorhanden ist.

Ein echter Assembler löscht verlorene Objekte während des Programmablaufs, nicht

erst am Ende des Programms. Deshalb ist ein besonderer Programmierstil erlaubt.

können wir Objekte unter beliebigen Bedingungen und in beliebiger Menge multiplizieren.

 
Vasiliy Sokolov #:

Die Produktivität hingegen wird im Allgemeinen gesteigert. Die manuelle Entfernung nimmt im Hauptstrom sehr viel Zeit in Anspruch. + Die Löschung erfolgt Element für Element. Vergleichen Sie z. B. zwei Versionen des Skripts in diesem Thread. Der Geschwindigkeitsunterschied beträgt mehrere Male. Auch die Speichereffizienz steigt. Denn die Müllabfuhr bewegt Gegenstände, die miteinander verdichtet sind. Wenn Sie es manuell verwalten, entstehen freie Speicherlöcher, die nicht so einfach wiederverwendet werden können. Außerdem arbeitet der Garbage Collector in einem anderen Thread. Grundlegende Zeit wird nicht verschwendet. Alles in allem: ein Plus.

Hmm ... Und in einem Müllsammler ist die Löschung nicht elementar? Ganz zu schweigen davon, dass der andere Thread, wenn keine freien Kerne vorhanden sind, von demselben Kern ausgeführt wird und den Hauptthread verlangsamt.

Meiner Meinung nach ist die Beseitigung von Müll durch den Benutzer bei sorgfältiger Überlegung immer effizienter als die Beseitigung durch den Garbage Collector. Wenn Sie sich jedoch nicht darum kümmern, gewinnt der Müllsammler auf jeden Fall.

Das ist der Grund, warum ich den Garbage Collector nicht mag, weil er die gleiche gleichgültige Behandlung von Ressourcen fördert.

 
Dmitry Fedoseev #:

Dies muss der "Assembler" sein, der die Meldung über Speicherlecks ausgibt, wenn der Auftrag beendet ist.

Wahrscheinlich werden dabei sogar übrig gebliebene Objekte gelöscht. Aber selbst wenn er sie löscht, gibt es eine große

Unterschied - sie werden erst am Ende des Auftrags gelöscht. Und wenn in einem mehrtausendfachen Zyklus neue Objekte geschaffen werden?

neue Objekte? Das Programm ist nicht funktionsfähig, da nicht genügend Speicher vorhanden ist.

Ein echter Assembler löscht verlorene Objekte während des Programmablaufs, nicht

erst am Ende des Programms. Deshalb ist ein besonderer Programmierstil erlaubt.

können wir Objekte unter beliebigen Bedingungen und in beliebiger Menge multiplizieren.

Das ist richtig. Das ist der Grund, warum ich nicht gerne mit Assembler arbeite - der Benutzer achtet nicht darauf, wie viele Objekte er/sie wo erstellt hat.

Im Grunde genommen vereinfacht es sogar die Entwicklung in gewisser Weise - man muss nicht daran denken, die belegte Datei zu löschen. Builder findet den Zeitpunkt, an dem das Objekt nicht mehr referenziert wird, und entfernt es. Aber diese Position ekelt mich an. Aus diesem Grund laufen die Programme immer langsamer und benötigen immer mehr und leistungsfähigere Hardware-Ressourcen für ähnlich komplexe Aufgaben.

 
Dmitry Fedoseev #:

Vasily, es tut mir leid, aber Sie verstehen überhaupt nicht, was Sie zu argumentieren versuchen. Überhaupt nicht und in keiner Weise.

Dmitry, entschuldige bitte, kennst du noch eine andere Programmiersprache als Mukl? Nein, das müssen Sie nicht. Und Sie haben immer noch nicht gelernt, wie man mit Objekten und Zeigern arbeitet, das geht aus den wenigen Codes und sogar Artikeln hervor, die Sie veröffentlicht haben. Deshalb kann ich nicht einmal ernsthaft auf diesen talentlosen und offen gesagt dummen Kommentar antworten. Lesen Sie endlich wikipedia, lernen Sie, was eine Müllabfuhr ist und wie sie organisiert ist, und lesen Sie wenigstens einmal, worauf Sie sich beziehen wollen. Bislang sieht das alles aus wie ein Hund, der eine Karawane anbellt: sinnlos und gnadenlos.
 
Georgiy Merts #:

Hmmm... Und im Müllsammler ist die Löschung nicht elementar? Ganz zu schweigen von der Tatsache, dass ein anderer Thread, wenn keine Kerne frei sind, von demselben Kern ausgeführt wird und den Hauptthread verlangsamt.

Meiner Meinung nach ist die Beseitigung von Müll durch den Benutzer bei sorgfältiger Überlegung immer effizienter als die Beseitigung durch den Garbage Collector. Wenn Sie sich jedoch nicht darum kümmern, gewinnt der Müllsammler auf jeden Fall.

Aus diesem Grund mag ich den Garbage Collector nicht, denn er fördert den gleichen gleichgültigen Umgang mit Ressourcen.

Anstatt Annahmen über die Funktionsweise eines Garbage Collectors zu treffen, sollten Sie einfach die Geschwindigkeit der automatischen Objektentfernung mit der manuellen Entfernung vergleichen. Alle Fantasien werden sofort verschwinden.

 
Vasiliy Sokolov #:

die Geschwindigkeit der automatischen Objektentfernung und der manuellen Objektentfernung zu vergleichen.

Die Antwort lautet vorzugsweise sofort. Es ist nicht immer Zeit für Experimente.