Verbesserungen für das C++ - stack-Zuweisung?
Anregungen für meinen stack auf Zuweisung?
(Außer für die Vorschläge zu verwenden um eine Klasse mit private/public-Mitglieder)
struct Heap
{
void* heap_start;
void* heap_end;
size_t max_end;
Heap(size_t size)
{
heap_start = malloc(size);
heap_end = heap_start;
max_end = size + (size_t) heap_start;
}
~Heap()
{
::free(heap_start);
}
void* allocate(size_t bytes)
{
size_t new_end = ((size_t) heap_end) + bytes;
if( new_end > max_end )
throw std::bad_alloc();
void* output = heap_end;
heap_end = (void*) new_end;
return output;
}
}
- Wie ist mein C++ Speicher-pool, WAS?
- Einfach Fragen, wenn es irgendeinen Weg gibt, es zu optimieren, oder besser Konventionen etc..
- Okay, Festsetzung der Titel deutlicher machen.
- Dies ist eine lineare Zuweisung, perfekt, wenn Sie don ' T care über die Freigabe oder freigeben können, alles auf einmal. Ich würde nicht beschreiben es als ein heap.
- naja nach den Definitionen online cplus.about.com/od/glossar1/g/heap.htm ein heap ist ein beliebiger block des Speichers zu reservieren, dynamische Variablen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie implementiert einen stack-basierten allocator. Sie können nicht frei machen, ohne Lücken. In der Regel bezieht sich auf einen pool, einen block zusammenhängenden Arbeitsspeichers mit festen großen Schlitze, die doppelt verkettete um eine Konstante Zeit hinzufügen und löschen.
Hier ist einer , die Sie als Richtschnur verwenden können. Es ist entlang den gleichen Linien wie deins, aber mit basic-Iteratoren über die zugewiesenen Knoten, und verwendet Vorlagen zu geben wissen.
Nicht gut, nie Dinge tun, wie, dass Sie davon ausgehen, dass sizeof(size_t)==sizeof(void*), auch, was passiert, wenn
bytes==(size_t)(-1)
würde es nicht funktionierenDarüber hinaus müssen Sie sich vergewissern, dass Hinweise, die Sie sind hin ausgerichtet sind.
Sonst würden Sie Probleme haben. So müssen Sie sicherstellen, dass die bytes sind Vielfache von 4 oder 8 je nach Ihrer Plattform.
Vorschlag? Nicht das Rad neu erfinden. Es gibt viele und gute pool-Bibliotheken.
sizeof([[un]signed] char) == 1
nach dem standard:-)
Zwei offensichtliche Probleme:
1/haben Sie sich nicht
deallocate()
.2/A
deallocate()
wird sehr schwer zu schreiben, mit Ihrer aktuellen Strategie, es sei denn, du bist immer gehen, um deallocate in genau umgekehrter Reihenfolge der Zuteilung. Sie müssen gerecht für den Fall, wo ein client will Speicher freigeben in der Mitte von Ihr verwendete".Natürlich, wenn Sie freigeben in umgekehrter Reihenfolge (2) ist das kein problem. Und wenn Sie noch nie free memory, (1) ist auch kein problem.
Es hängt davon ab, was Sie wollen, es zu tun.
Ihre heap erlaubt keine Freigabe. Wie werden Sie es verwenden für Objekte zugewiesen mit neue in C++?