2016-09-20 4 views
0

Ich bewerte die Protobuf Arena-Zuweisung für die Verwendung mit nicht protobufbezogenen Klassen. Genauso wie ein Tool, um Objekte aus einem Speicherpool einfach zuzuordnen/zu entfernen.Protobuf: Maximale Speichergröße für die Arena

Ich habe nicht in seiner API (https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.arena#Arena) eine Möglichkeit gefunden, den maximalen Speicher für die Arena zu verwenden. Ich möchte die Speichernutzung begrenzen und zulassen, dass das Programm mit der Arena stirbt, anstatt mehr Speicher als erwartet zu verbrauchen.

Gibt es noch eine andere C++ - Bibliothek für die Speicherpoolverwaltung, die es zu prüfen lohnt? Die Protobuf-Arena ist ziemlich einfach zu benutzen, deshalb habe ich damit angefangen.

Antwort

0

Es gibt keine echte integrierte Funktionalität für die Abdeckung der Speicherauslastung, aber ich glaube, dass Sie das gleiche Ergebnis erzielen können, indem Sie die richtigen Haken auf dem ArenaOptions setzen. Sie möchten insbesondere die Haken on_arena_init und on_arena_allocation einstellen. In on_arena_init können Sie ein Objekt erstellen, um Ihren Status zu speichern (wahrscheinlich nur ein Zähler der bisher zugewiesenen Bytes) und das als void* zurückgeben. Jedes Mal, wenn die Arena mehr Speicher reservieren muss, ruft sie Ihren on_arena_allocation Haken an und gibt Ihr void* als Argument cookie weiter, damit Sie Ihren Größenzähler aktualisieren und bestätigen können, dass er unter der von Ihnen festgelegten Speicherkapazität liegt. Beachten Sie, dass dies die Speicherblöcke verfolgt, die von der Arena vom Systemzuordner abgerufen werden, nicht die Speicherblöcke, die von der Arena an den Anwendungscode übergeben werden, aber es klingt wahrscheinlich so, als ob dies das gewünschte Verhalten ist. Sie müssen möglicherweise auch die on_arena_reset und on_arena_destruction Hooks: Ersteres, um Ihren Zähler auf Null zurückzusetzen und letzteres, um Ihr Cookie zu löschen, um ein Speicherleck zu vermeiden.

Verwandte Themen