Frage

int main(void)
{
   std::string foo("foo");
}

Mein Verständnis ist, dass der obige Code den Standard allocator verwendet neue zu nennen. Also auch wenn die std :: string foo auf dem Stapel der internen Puffer innerhalb von foo auf dem Heap zugewiesen zugeordnet ist.

Wie kann ich eine Zeichenfolge, die vollständig auf dem Stapel zugeordnet ist?

War es hilfreich?

Lösung

Ich wollte nur diese selbst vor kurzem tun und fand den folgenden Code Beleuchtung:

chronium des stack_container.h

Es definiert einen neuen std::allocator die stackbasierten Zuteilung für die erste Zuweisung von Speicher für STL-Container zur Verfügung stellen kann. Ich zog einen anderen Weg zu finden, bis zu meinem speziellen Problem zu lösen, so dass ich nicht wirklich den Code selbst verwenden, aber vielleicht wird es für Sie nützlich sein. Seien Sie sicher, dass die Kommentare in dem Code in Bezug auf Nutzung und Einsprüche lesen.

Für diejenigen, die den Nutzen und die geistige Gesundheit, dies zu tun in Frage gestellt haben, sollten Sie:

  • Oft wissen Sie von vornherein, dass die Zeichenfolge eine angemessene maximale Größe hat. Zum Beispiel, wenn die Zeichenfolge ein Dezimal-Format integer 32-Bit speichern wird, wissen Sie, dass Sie zu tun, nicht mehr als 11 Zeichen benötigen. Es besteht keine Notwendigkeit für eine Zeichenfolge, die zu unbegrenzter Größe in diesem Fall dynamisch wachsen können.
  • aus dem Stapel Allokierung ist in vielen Fällen schneller als aus dem Heap zugewiesen werden.
  • Wenn die Zeichenfolge erstellt und zerstört häufig (nehme an, es eine lokale Variable in einer üblicherweise verwendeten Nutzenfunktion ist), vom Stapel Zuweisung wird anstelle der Heapfragmentierung auslösenden Churn im Heap allocator vermeiden. Für Anwendungen, die viel Speicher verwenden, dies ist ein Spiel-Wechsler sein könnte.

Einige Leute haben gesagt, dass eine Zeichenfolge, die Stack-basierte Zuordnung verwendet, wird keine std::string sein, als ob das irgendwie ihre Nützlichkeit abnimmt. Zwar kann man die beiden austauschbar nicht verwenden, so dass Sie erwarten ein stackstring nicht in der Lage sein, Ihre std::string an Funktionen übergeben. Aber (wenn Sie es richtig tun), werden Sie in der Lage sein, alle verwenden die gleichen Mitgliederfunktionen auf Ihrem stackstring, die Sie jetzt auf std::string verwenden, wie find_first_of(), append() usw. begin() und end() noch funktionieren, so dass Sie sein Lage, viele der STL-Algorithmen zu verwenden. Sicher, es wird nicht im engeren Sinne std::string werden, aber es wird immer noch ein „string“ im praktischen Sinne sein, und es wird immer noch sehr nützlich sein.

Andere Tipps

Das Problem ist, dass std::basic_string einen Template-Parameter für das allocator hat. Aber std::string ist keine Vorlage und hat keine Parameter.

Also, man könnte im Prinzip eine Instanziierung von std::basic_string mit einem allocator verwenden, die Speicher auf dem Stapel verwendet, aber es wäre kein std::string sein. Insbesondere würden Sie nicht Runtime Polymorphismus, und Sie könnten die resultierenden Objekte in Funktionen erwarten ein std::string nicht passieren.

Sie können nicht. Außer ...

std::string ist eine Instantiierung

std::basic_string<class CharType, 
                  class Traits=char_traits<CharType>, 
                  class Allocator=allocator<CharType> >

Sie können eventuell eine Allocator Klasse definieren, die alloca für die Speicherverwaltung. Dies würde nur funktionieren, wenn die Allocator selbst und die basic_string Methoden, die sie direkt aufrufen oder indirekt sind alle inline. Ein basic_string Objekt mit diesem allocator erstellt würde nicht sein ein std::string, aber es sei (meistens), wie es sich verhalten. Dies würde jedoch eine Menge Arbeit für begrenzten Gewinn sein. Insbesondere die Verwendung dieser Klasse zurückzukehren Werte aus einer Funktion wäre eine Karriere Hemmnis.

Ich habe keine Ahnung Warum Sie oder jemand anderes möchten, dies zu tun.

Ich vermute, dass solch eine Sache zu tun wäre schwer zu tun, frage ich mich, warum Sie es tun? Um etwas völlig auf dem Stapel zuweisen, muss der Compiler bei der Kompilierung wissen, was die genaue Größe der Sache ist - in Ihrem Beispiel würde es wissen muß, nicht nur die Größe der std::string Metadaten, sondern auch die Größe der String-Daten selbst. Dies ist nicht zu flexibel, würden Sie wahrscheinlich verschiedene String-Typen müssen auf die Größe der String-Daten ab, die Sie darin enthalten wollen, sind - nicht, dass es unmöglich sein würde, zu tun, nur würde es dazu neigen, die Dinge ein wenig komplizierter zu werden.

  • std :: string wird immer gelingt es interne Speicher mit neu / löschen.
  • Nicht sicher, warum Ihre Frage enthält die glibc String Implementierung . Die Zeichenfolge Implementierung der C ++ Standardbibliothek hat nichts mit glibc zu tun.
  • Die einzige Möglichkeit, einen String auf den Stack zu speichern ist ein C char-Array auf dem Stack zu verwenden (wie das, was Shhnap umrandet). Aber das ist wahrscheinlich nicht das, was Sie wollen auf jeden Fall: -)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top