Frage

Ich versuche herauszufinden, ob der Boost :: Multi_array -Konstruktor oder die Größe der Größe eine Ausnahme von bad_alloc ausführen kann (oder eine andere Ausnahme, die die Zuordnung oder die Größe der Größe fehlgeschlagen hat). Ich kann diese Informationen nirgendwo in der Dokumentation finden.

Klarstellung (aus Kommentar hinzugefügt):

Dies ist ein wissenschaftlicher Algorithmus, der auf eine weniger speicherintensive (langsamere) Methode zurückgreifen kann, wenn die Zuordnung fehlschlägt. Grundsätzlich gibt es zwei dynamisch zugewiesene dreidimensionale Arrays, um "Abstände" (Korrelation) zwischen allen Genenpaaren in einer Abfrage und allen Genen in einem Kreuzvalidierungssatz für jede große Anzahl von Datensätzen zu halten. Die langsamere Methode berechnet jeden Abstand im laufenden Fliegen, wie sie benötigt wird. Dies gilt für eine C ++ - Version einer vorhandenen Java -Implementierung, die beide Methoden implementierte und auf eine Ausnahme von Speicher zurückgreifen würde. Ich erwarte nicht wirklich, dass ich das Gedächtnis ausgeht.

War es hilfreich?

Lösung

1: (Beantwortung der eigentlichen Frage): Da es dynamisch zugewiesenen Speicher verwendet, kann er werfen std::bad_alloc (Ich habe noch nie eine Boost -Übersetzung gesehen std::bad_alloc Ausnahmen; Es wäre verrückt, dies zu tun).

2.: (Kommentar zu Ihrer Klärung): Sie benötigen die Informationen des verfügbaren physischen Speichers, um die Leistung Ihres Algorithmus zur Laufzeit zu optimieren. Sie können sich jedoch nicht verlassen std::bad_alloc Um festzustellen, wie viel Speicher Sie zur Verfügung stehen, wie moderne Betriebssysteme so etwas verwenden wie Überbeamten, Bedeutung: Sie geben (fast) niemals einen fehlgeschlagenen Zuweisungsversuch zurück, sondern geben Ihnen nur eine "Erinnerung", die nur dann nicht existieren wird, wenn Sie tatsächlich versuchen, darauf zuzugreifen.

In Java kann dies funktionieren, da die VM viele Dinge für Sie tut: Es versucht, kontinuierliche Speicherbrocken zuzuweisen, und tut dies in Bezug auf das verfügbare physische Gedächtnis und die verfügbaren ungebraucht Physisches Gedächtnis, um zu entscheiden, ob es den GC mehr betonen oder einfach einen größeren Müll zuweisen. Aus Leistungsgrund müssen Sie auch berücksichtigen, dass das virtuelle Gedächtnis und das physische Gedächtnis ganz unterschiedliche Konzepte sind.

Wenn du brauchen Um Ihre Algorithmen für solche Fälle zu optimieren (was je nach Arbeitsbereich möglicherweise erforderlich ist) müssen Sie Ihre plattformspezifischen Funktionen inspizieren, die Ihnen sagen können, wie "die reale Welt" aussieht.

Andere Tipps

Das Fehlen einer explizite Ausnahmespezifikation ist beabsichtigt. Sehen Dies Unterabschnitt für eine Erklärung. Beachten Sie außerdem, dass das Fehlen einer expliziten Spezifikation bedeutet, dass die Art der Ausnahme, die eine Funktion auswirken kann, keine Einschränkung gibt. Zumindest kann der CTOR und die Größe der Größe die Größe Ausnahmen veröffentlichen, falls der Speicher erschöpft ist oder wenn eine Element-Objekt-Kopie fehlschlägt.

Einige generische Referenzen, die Boost inspirierten, an denen Sie interessiert sein könnten, sind:

Warum nicht testen? Es ist einfach, einen absurd hohen Wert zu bestehen, um die Ausnahme zu generieren.

Was planen Sie andererseits, wenn Sie diese Ausnahme generieren? std::bad_alloc ist die Art von Ausnahme, mit der Sie normalerweise nicht auf Mikroebene umgehen können ...

Zum Beispiel würden Sie auf einem Webserver normalerweise eine Reinigung durchführen (Rollback bei der DB -Transaktion?) Und dann eine zurückgeben 500 Fehler beim Benutzer.

Aber wenn das Gedächtnis erschöpft ist, gibt es nicht viel, was Sie sicher tun können, da Sie vorsichtig treten müssen, wenn Sie nicht wieder die Speicherwand treffen möchten, von der Sie wissen, dass sie in der Nähe ist :)

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