Warum ist nicht std :: string :: max_size () == std :: string :: allocator :: max_size ()

StackOverflow https://stackoverflow.com/questions/1592476

  •  22-09-2019
  •  | 
  •  

Frage

Vor kurzem habe ich bemerkt, dass die folgende Aussage nicht wahr gegeben std::string s ist.

s.max_size() == s.get_allocator().max_size();

ich diese interessant finden, die standardmäßig std::string wird std::allocator<char> verwenden, die eine theoretische Grenze von size_type(-1) hat (ja, ich weiß, ich bin 2-Komplement davon aus, aber das ist in keinem Zusammenhang mit der eigentlichen Frage). Ich weiß, dass die praktischen Grenzen deutlich geringer sein werden als diese. An einem typischen 32-Bit-x86-System, wird der Kernel besetzen 2GB (vielleicht 1 GB) des Adressraumes eine viel kleinere praktische obere Grenze verlassen.

Wie auch immer, GNU libstdc ++ 's std::basic_string<>::max_size() scheint den gleichen Wert zurück, unabhängig davon, was der Zuordner es verwendet sagt (so etwas wie 1073741820).

So bleibt die Frage offen, warum std::basic_string<>::max_size() nicht nur get_allocator().max_size() zurückkehren? Es scheint mir, dass dies die hypothetische Obergrenze ist. Und wenn die Zuteilung kurz kommt, es wird nur ein std::bad_alloc werfen, warum also nicht versuchen?

Dies ist eher eine Kuriosität als alles andere, ich habe mich nur gefragt, warum die beiden getrennt definiert in mindestens diese Umsetzung.

War es hilfreich?

Lösung

Microsoft Connect geschrieben Bug wurde zu Ihrer Frage . Microsoft hat interessante Antwort darauf:

  

Wir haben es als By Design nach unserer Interpretation des Standards beschlossen, die nicht eindeutig erklären, was der Verwendungszweck für max_size () ist. Zuordner max_size () wird als "der größte Wert, der Bedeutung mit X übergeben werden kann :: zuteilen ()" beschrieben (C ++ 03 20.1.5 [lib.allocator.requirements] / Tabelle 32), aber Behälter max_size () ist als "size () des größtmöglichen Container" (23,1 [lib.container.requirements] / Table 65). Nichts beschreibt, ob oder wie Behälter max_size () sollte von Allocator max_size abgeleitet werden (). Unsere Implementierung seit vielen Jahren abgeleitete Container max_size () direkt aus Allocator max_size () und dann diesen Wert für Überlaufprüfungen verwendet und so weiter. Andere Interpretationen des Standard, wie der Ihren, sind möglich, aber nicht eindeutig zu uns korrigieren. Der Wortlaut der Norm könnte sicherlich hier aus Klärung profitieren. Es wäre denn, und bis es soweit ist, haben wir beschlossen, unsere aktuelle Implementierung unverändert aus zwei Gründen verlassen: (1) andere Kunden auf unserem derzeitigen Verhalten in Abhängigkeit können, und (2) max_size () grundsätzlich nichts kaufen. Allenfalls Dinge, die Zuweiser konsumieren (wie Container) könnte Allocator max_size () verwenden, um vorherzusagen, wann zuweisen () fehlschlagen - aber einfach zuweisen () aufgerufen ist ein besserer Test, da der Verteiler wird dann entscheiden, Speicher zu geben, oder nicht. Dinge, die verbrauchen Behälter Behälter max_size () als Garantie dafür, wie groß Größe verwenden könnte () könnte sein, aber eine einfachere Garantie Palette size_type.

Zusätzlich hier könnte finden Core-Ausgabe # 197. Der Ausschuß hat Antrag prüft den Wortlaut der Norm zu verbessern, aber es wurde abgelehnt.

So die Antwort auf Ihre Frage: „Warum ..?“ ist, dass Standard nicht eindeutig erklären, was ist der Verwendungszweck für max_size ().

Andere Tipps

Ich bin nicht ganz sicher, aber soweit ich weiß, std::basic_string wird in dem aktuellen Standard zu speichern, die Zeichenfolge im Dauerspeicher beschränkt. Zum Beispiel kann es in mehreren Stücken speichern. Jede solche Brocken wird dann beschränkt auf std::allocator::max_size() aber die Summe kann größer sein als das.

Auch scheint es der Fall mit STL-Containern zu sein. Und nachdem alle std::basic_string ist ein Container.

GCC-Implementierung hat einen Kommentar, wie sie berechnen max_size (man hat die Größe des internen Housekeeping Objekt zu subtrahieren, die als ein einzelner Block mit der Zeichenfolge zugeordnet wird), und fügt dann hinzu, dass max_size() ein Viertel davon zurückgibt. Es gibt keinen Grund gegeben, so vielleicht ist es nur eine Sicherheitsmarge? (Es soll auch ein Seil Klasse bieten, die vielleicht ein für so große Strings verwenden würden?)

Mit VC ++ max_size() liefert einen weniger als allocator.max_size() - wahrscheinlich zu Konto für Nullzeichen endet.

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