Frage

Ich bin ein C ++ Programmierer das ist mit D für ein persönliches Projekt bedenkt, dass ich spielen, um möge. Ich frage mich, ob es einen Weg gibt, um vollständig den Garbage Collector zu deaktivieren, und was die Risiken sind, dies zu tun.

Ich weiß, ich kann durch zwingende neue meine eigenen Speicher verwalten und löschen malloc und kostenlos zu benutzen, aber wenn ich es tue, dass ich lieber die Garbage Collector nicht ausgeführt.

War es hilfreich?

Lösung

Um die GC in D2 zu deaktivieren:

import core.memory;

void main(string[] args) {
    GC.disable;
    // Do stuff.
}

Bei der Verwendung von D1 / Phobos:

import std.gc;

void main(char[][] args) {
    std.gc.disable;
    // Do stuff.
}

D1 / Tango:

import tango.core.Memory;

void main(char[][] args) {
    GC.disable;
    // Do stuff.
}

Der GC kann in ähnlicher Weise wieder aktiviert werden durch GC.enable (D2 oder D1 / Tango) oder std.gc.enable (D1 / Phobos) aufrufen. Diese können an einer beliebigen Stelle in einem Programm durchgeführt werden. Intern wird ein Zähler verwendet, und tatsächlich reaktivieren GC, müssen Sie rufen aktivieren () einmal für jedes Mal deaktivieren () aufgerufen wurde.

Hier sind einige Dinge nicht mit GC deaktiviert zu tun, weil sie Speicherlecks verursachen werden:

  1. Verwenden Sie das Array append nicht (~ =) Operator oder die .length Eigenschaft verwenden, um ein Array zu erweitern, die bereits zugeordnet wurde. Diese stützen sich auf GC das alte Array zu befreien, wenn es neu zugewiesen werden muss, da es möglicherweise in dem Programm, um es woanders sein Aliasing.
  2. Sie nicht builtin assoziative Arrays verwenden. Der einzige Weg, diese ist von GC zu befreien.
  3. Die meisten von Phobos und, wie ich glaube, Tango, wurden unter der Annahme konzipiert, dass die Garbage Collection vorhanden ist. Funktionen in diesen Bibliotheken fürchterlich Speicherleck, wenn w / o GC verwendet.
  4. Sie nicht D2 Verschlüsse mit GC deaktiviert verwenden. (Nicht, dass man es trotzdem, für ein Spiel).

Wie gesagt, während D ausgelegt ist, mit der GC in wenigen kritischen Teile des Codes (der Art der kritischen Stücke deaktiviert sein verwendbar, wo Echtzeitbeschränkungen existieren, und Sie sollten wahrscheinlich nicht jede Form von malloc verwenden nicht explizit entworfen für Echtzeit-Berechnung sowieso), wurde es weitgehend mit der Annahme konzipiert, dass GC vorliegen würde. In Ihrem Fall können Sie immer noch GC verwenden für alle der Initialisierung Sachen usw. und es nur deaktivieren, wenn Sie den Teil des Spiels getroffen, die tatsächlich benötigt Echtzeit sein.

Als Randbemerkung, GC und manuelle Speicherverwaltung in D nebeneinander bestehen können, und in der Praxis, wenn der Code zu optimieren, manuell einige großen Objekte mit trivialen Lebensdauern löschen können zu bedeutenden Beschleunigungen führen. Dies kann ähnlich wie C ++ durchgeführt werden, eine Lösch Anweisung, und ist sicher, auch zu tun, wenn der GC aktiviert ist. Wenn Sie keine Echtzeitbeschränkungen haben, das gibt Ihnen die meisten Vorteile von GC mit den meisten der Leistung der manuellen Speicherverwaltung.

Andere Tipps

Wenn Sie malloc verwenden und die kostenlose Nutzung std.c.stdlib . GC nie diese berühren. std.gc hat alle Sachen, die Sie für die Speicherverwaltung benötigt, einschließlich disable ().

GC ist keine schlechte Sache, aber. Die meisten, wenn nicht fast alle Bibliotheken in D werden irgendwo im Code, wo Speicher nicht explizit gelöscht werden, so wird es nicht einen Helden macht es haben jeden ab, aber in Ordnung, wenn Sie einigen wichtigen Leistungsbedarf haben.

GC macht alles viel produktiver wie Array Aufschneiden und neue Objekte in Parametern zu schaffen, ohne dass der Anrufer sie einen Verweis überall speichern zu müssen. Guter Code ist viel weniger davon und mit GC-Code wird viel kleiner ist.

Der GC kann mit einem einfachen Wrapper um malloc / free entfernt und ersetzt werden.

Ich las über D Sprache und ich fand diese in den Spezifikationen, die in D neu erscheint:

  

40. Besser C

     

-betterC ist ein Kommandozeilen-Flag für DMD, die die Unterstützung von bestimmten Laufzeitfeatures des Compilers einschränkt. Bemerkenswert ist, mit betterC zusammengestellt D-Programme oder Bibliotheken sind nicht mit Druntime verknüpft. Die Verwendung von Kompilierung-Funktionen ist nicht in irgendeiner Weise eingeschränkt.    https://dlang.org/spec/betterc.html

Einer der Folge der Verwendung dieser Befehlszeilen Flag Features GC und Sprache auf sich die Weiterleitung zu deaktivieren.

  

40,1 Konsequenzen

     

Da keine Druntime verfügbar ist, werden viele D-Funktionen nicht funktionieren. Zum Beispiel:

     
      
  • Garbage Collection
  •   
  • Thread-lokalen Speicher
  •   
  • Typeinfo und Module
  •   
  • Klassen
  •   
  • Einbau-Threading (z core.thread)
  •   
  • Dynamische Arrays (aber nicht Scheiben) und assoziative Arrays
  •   
  • Ausnahmen
  •   
  • Schalter mit Strings
  •   
  • Endabschaltung
  •   
  • synchronisiert und core.sync
  •   
  • Statische Modulbauer oder deconstructors
  •   
  • Struct deconstructors
  •   
  • Unittest (Test kann mit der -betterC Flagge wie üblich)
  •   

siehe auch https: // dlang. org / blog / 2017/08/23 / d-as-a-better-c /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top