Groups | Search | Server Info | Keyboard shortcuts | Login | Register
Groups > de.sci.informatik.misc > #372
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Newsgroups | de.sci.informatik.misc |
| Subject | Re: Freispeichermanagement |
| Date | 2022-12-15 11:30 +0100 |
| Message-ID | <tnf0gh.nk.1@stefan.msgid.phost.de> (permalink) |
| References | <jvr0o1Fdr6vU1@mid.individual.net> <tnag8q.4to.1@stefan.msgid.phost.de> <jvs1hhFin2bU4@mid.individual.net> <tnd9n5.5gc.1@stefan.msgid.phost.de> <jvv8nbF3jfoU1@mid.individual.net> |
Am 15.12.2022 um 01:40 schrieb Andreas Wagner:
> Am 14.12.2022 um 19:55 schrieb Stefan Reuther:
>> Wenn wir das mal mit RAM statt Datei durchspielen, meinte ich verstanden
>> zu haben, dass dir sowas vorschwebt:
>>
>> struct Node {
>> struct Node* left;
>> struct Node* right;
>> int payload;
>> };
>
> Ich würde parent mit hinzunehmen. Den braucht man zum Rebalancieren.
[...]
> Das hängt das ja nicht in einen Binärbaum ein. Ich kann dir hier nicht
> folgen.
Gut möglich. War nur zur Illustration, eine Baum-Implementierung
schüttel ich nicht mal eben für ein Posting aus dem Ärmel, da müsstest
du eben deine Verkettungslogik einsetzen. Wenn ich einen Baum brauche,
nehme ich normalerweise std::map :) Und wenn ich einen Allokator baue,
reicht mir normalerweise eine einfache Liste.
>> // und zum Freigeben von Speicher dann
>> store(addrlist_root, address);
>> store(sizelist_root, size);
>
> free_spaces_by_pos.store(&new_node, new_node.get_payload_size());
> free_spaces_by_size(new_node.get_payload_size(), &new_node);
Die Frage ist halt: wird deine store-Methode Knoten allokieren, um die
(Baum-)Nutzdaten 'new_node.get_payload_size()' ablegen zu können? Dann
stehst du vor dem von dir beschriebenen Problem. Eine Lösung wäre halt,
der Funktion nicht zu sagen "hier ist ein Datum, kümmer dich selber, wie
du die Verkettungsdaten ablegst" sondern "hier ist ein Knoten mit Platz
für deine Verkettungsdaten, füge den ein". Und wenn du einen Knoten aus
einer Map auskettest, hast du immer einen weiteren Knoten, um ihn in
eine andere einzuketten.
Ein Stichwort wäre "intrusive data structure".
>> void insertNode(struct Node* root, struct Node* node)
>> {
>> // hier nur das Einketten
>> node->left = root->left;
>> root->left = node;
>> }
>
>> // und zum Freigeben von Speicher dann
>> struct FreeBlock* p = (struct FreeBlock*) address;
>> p->in_addrlist.payload = address;
>> insertNode(addrlist_root, &p->in_addrlist);
>> p->in_sizelist.payload = size;
>> insertNode(sizelist_root, &p->in_sizelist);
>
> Wie sind hie address und size definiert?
Na die Adresse bzw. Größe, die du in deiner ersten und zweiten Map
speichern wolltest eben.
Stefan
Back to de.sci.informatik.misc | Previous | Next — Previous in thread | Next in thread | Find similar
Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-13 09:59 +0000
Re: Freispeichermanagement Stefan Reuther <stefan.news@arcor.de> - 2022-12-13 18:28 +0100
Re: Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-13 20:19 +0100
Re: Freispeichermanagement Stefan Reuther <stefan.news@arcor.de> - 2022-12-14 19:55 +0100
Re: Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-15 01:40 +0100
Re: Freispeichermanagement Stefan Reuther <stefan.news@arcor.de> - 2022-12-15 11:30 +0100
Re: Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-18 11:28 +0000
csiph-web