Ich habe in letzter Zeit viel über Rost gelesen, aber ich fange immer noch an zu oxidieren. Mein Gehirn behält die meisten seiner C/C++ - Reflexe, also verzeiht mir, wenn diese Frage nicht relevant ist, weil Dinge in Rust gemacht werden.Wie partitioniert und verwendet man Massenspeicher, der en masse mit Rust zugewiesen wurde?
Ist es allgemein möglich (wünschenswert?), Einen Block einer willkürlichen Größe auf dem Haufen zuzuordnen und dann eine Datenstruktur darüber mit Bindungen zu bilden, die Besitz von kleineren Stücken des Gedächtnisses übernehmen?
Verwendung von C99 kann man schreiben:
typedef unsigned char BYTE;
typedef struct {
size_t size;
BYTE payload[];
} flex;
// ...
flex * flex_new(size_t _size) {
flex *f = malloc(sizeof(flex) + _size * sizeof(BYTE));
f->size = _size;
return f;
}
Flexible Länge Arrays können als nützlich erweisen, z.B. bei der Implementierung von Speicherpools mit Blöcken variabler Größe oder beim Zuweisen von Speicher auf dem Heap, der einem Thread zugewiesen ist. Die Datenstruktur, deren Größe nur zur Laufzeit bekannt ist, wird atomar zugeordnet und ihre Elemente werden zusammenhängend gepackt.
Ich frage mich, ob eine ähnliche Rust-Implementierung möglich ist (ohne unsafe
Konstrukte) und wenn es ist, wie es aussieht. Vielleicht kann der Compiler Informationen unter Verwendung der Lebensdauerspezifizierer in der struct
Definition ableiten?
Es gibt wahrscheinlich gute Verwendungszwecke, aber wenn ja, verwenden sie wahrscheinlich 'unsicher '. Es hilft nicht, dass viele Bibliotheken, die Sie erwarten, dies tun, tatsächlich unterschiedliche Wege gefunden haben: 'Vec' ist ein' (ptr, length, capacity) 'triple anstatt ein Zeiger auf' (length, capacity, items) ' und 'Arena' huckelt auf' Vec's, die nie in der Größe verändert werden. – delnan
Ich war mir der Arena nicht bewusst und werde sofort darüber nachdenken, danke! Ich hätte sagen sollen, dass es mir egal ist, ob "unsicher" verwendet wird, solange eine sichere Schnittstelle in "Std" oder als Kandidat dafür bereitgestellt wird. – dummydev
@ Delnan klingt wie Sie sollten das als Antwort hinzufügen.^_^ – Shepmaster