Wie kann ich das String-Interning in C oder C ++ durchführen?

7

Gibt es etwas wie intern() Methode in C oder C ++, wie es sie in Java gibt? Wenn nicht, wie kann ich String Interning in C oder C ++ durchführen?

    
Suhail Gupta 17.05.2012, 11:31
quelle

3 Antworten

15

boost::flyweight< std::string > scheint genau das zu sein, wonach Sie suchen.

    
Ylisar 17.05.2012 11:50
quelle
6
  

Gibt es so etwas wie intern () in C, wie wir es in Java haben?

Nicht in der Standard-C-Bibliothek.

  

Wenn nicht, wie wird das String-Interning in C ausgeführt?

Mit großer Schwierigkeit fürchte ich mich. Das erste Problem ist, dass "string" in C keine gut definierte Sache ist. Stattdessen haben Sie char * , was auf eine Null-terminierte Zeichenkette zeigen könnte, oder könnte nur eine Zeichenposition bezeichnen. Dann haben Sie das Problem, dass einige Zeichenfolgen in andere Dinge eingebettet sind oder auf dem Stapel gespeichert sind. Beides macht Internieren unmöglich und / oder bedeutungslos. Dann gibt es das Problem, dass C-String-Literale nicht garantiert interniert werden ... in der Art, wie Java es garantiert. Schließlich gibt es das Problem, dass das Internieren ein Speicherleck ist, das darauf wartet, ausgeführt zu werden ... wenn die Sprache nicht Müll gesammelt wird.

Nachdem dies gesagt wurde, würde der Weg zur Implementierung von Interning in C darin bestehen, eine Hash-Tabelle zu erstellen, die die intern gespeicherten Strings enthält. Sie müssen es zu einer Voraussetzung machen, dass Sie eine Zeichenfolge nicht internieren können, es sei denn, es handelt sich entweder um ein Literal oder eine Zeichenfolge, die in einem eigenen Heap-Knoten zugewiesen ist. Um das Problem mit dem Speicherleck zu beheben, benötigen Sie eine Referenzzahl pro String, um zu erkennen, wann eine interne Zeichenfolge verworfen werden kann.

    
Stephen C 17.05.2012 12:18
quelle
3

Was würde String-Interning in einer Sprache bedeuten, die einen Wert hat? Semantik? Interning ist ein Mechanismus zum Erzwingen der Objektidentität Verweise auf Strings mit Wertidentität. Es ist relevant in Sprachen die Referenzsemantik verwenden und Objektidentität als Standard verwenden Vergleichsfunktion. C ++ verwendet standardmäßig Wertesemantiken und Typen wie std::string haben keine Identität, also macht Internieren keinen Sinn.

Einige Implementierungen (z. B. g ++) können eine Form von Referenzsemantik verwenden für die String-Daten, hinter den Kulissen. Solch eine Implementierung könnte bieten eine Art Internierung dieser Daten, als Erweiterung. (G ++ nicht, soweit ich weiß, aber wird automatisch "intern" leer Zeichenketten.)

Die meisten anderen Implementierungen verwenden nicht einmal Referenzsemantiken im Inneren. Wie würdest du eine Implementierung mit dem kleinen internieren? Stringoptimierung (wie MS)? Wo die Daten buchstäblich in der Klasse sind In einigen Fällen gibt es no dynamisch zugewiesenen Speicher.

    
James Kanze 17.05.2012 13:02
quelle

Tags und Links