Library: draft memory rearrangements

not clear yet how to handle the classical "realloc" situation
This commit is contained in:
Fischlurch 2024-05-29 01:01:16 +02:00
parent feeee4096d
commit 2abbae77d7
2 changed files with 86 additions and 4 deletions

View file

@ -47,22 +47,27 @@
#include "lib/iter-explorer.hpp"
#include "lib/util.hpp"
#include <cstring>
#include <utility>
#include <vector>
namespace lib {
using std::vector;
using std::forward;
using std::move;
using std::byte;
namespace {// Allocation managment policies
namespace {// Allocation management policies
struct HeapOwn
{
void*
realloc (void* data, size_t oldSiz, size_t newSiz)
{
UNIMPLEMENTED ("adjust memory allocation"); ///////////////////////////OOO Problem Objekte verschieben
}
};
}
@ -115,7 +120,54 @@ namespace lib {
void
adjustStorage (size_t cnt, size_t spread)
{
UNIMPLEMENTED ("allocation");
if (cnt*spread > storageSiz_)
{// need more storage..
Col::data_ = static_cast<typename Col::Bucket> (POL::realloc (Col::data_, storageSiz_, cnt*spread));
storageSiz_ = cnt*spread;
}
ENSURE (Col::data_);
if (spread != Col::data_->spread)
adjustSpread (spread);
if (cnt*spread < storageSiz_)
{// attempt to shrink storage
Col::data_ = static_cast<typename Col::Bucket> (POL::realloc (Col::data_, storageSiz_, cnt*spread));
storageSiz_ = cnt*spread;
}
}
/** move existing data to accommodate spread */
void
adjustSpread (size_t newSpread)
{
REQUIRE (Col::size_);
REQUIRE (Col::data_);
REQUIRE (newSpread * Col::size_ <= storageSiz_);
size_t oldSpread = Col::data_->spread;
if (newSpread > oldSpread)
// need to spread out
for (size_t i=Col::size_-1; 0<i; --i)
shiftStorage (i, oldSpread, newSpread);
else
// attempt to condense spread
for (size_t i=1; i<Col::size_; ++i)
shiftStorage (i, oldSpread, newSpread);
// data elements now spaced by new spread
Col::data_->spread = newSpread;
}
void
shiftStorage (size_t idx, size_t oldSpread, size_t newSpread)
{
REQUIRE (idx);
REQUIRE (oldSpread);
REQUIRE (newSpread);
REQUIRE (Col::data_);
byte* oldPos = Col::data_->storage;
byte* newPos = oldPos;
oldPos += idx * oldSpread;
newPos += idx * newSpread;
std::memmove (newPos, oldPos, util::min (oldSpread,newSpread));
}
template<class IT>

View file

@ -81870,6 +81870,25 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1716909012702" ID="ID_1876994172" MODIFIED="1716909016713" TEXT="const-correctness">
<node CREATED="1716909019405" ID="ID_1406909807" MODIFIED="1716909042294" TEXT="ein const Several&lt;X&gt; ist ein Several&lt;const X&gt;"/>
</node>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1716936826666" ID="ID_1382882363" MODIFIED="1716936834769" TEXT="Problem: Objekte verschieben">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1716936845950" ID="ID_715653412" MODIFIED="1716936862044" TEXT="eigentlich darf man das nur bei trivial kopierbaren Objekten">
<node CREATED="1716936929564" ID="ID_707314614" LINK="https://en.cppreference.com/w/cpp/named_req/TriviallyCopyable" MODIFIED="1716936935390" TEXT="TriviallyCopyable"/>
<node CREATED="1716937009097" ID="ID_284902115" MODIFIED="1716937022112" TEXT="au&#xdf;erdem: es darf keine Verzeigerung geben">
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node CREATED="1716937025743" ID="ID_323500560" MODIFIED="1716937028858" TEXT="zwei F&#xe4;lle">
<node CREATED="1716937029830" ID="ID_12032052" MODIFIED="1716937071076" TEXT="Spread ge&#xe4;ndert &#x27f6; in-place"/>
<node CREATED="1716937071856" ID="ID_783851911" MODIFIED="1716937099960" TEXT="klassische re-Allokation an eine andere Stelle">
<node CREATED="1716937118530" ID="ID_40686362" MODIFIED="1716937137107" TEXT="hier k&#xf6;nnte man alternativ auch die Objekte move-kopieren"/>
<node CREATED="1716937138104" ID="ID_1463751078" MODIFIED="1716937157438" TEXT="aber: std::realloc gibt den alten Puffer sofort frei"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1716937163164" ID="ID_1513844512" MODIFIED="1716937171050" TEXT="wie geht std::vector damit um?">
<icon BUILTIN="help"/>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1716914864769" ID="ID_966642586" MODIFIED="1716914906125" TEXT="Builder-Operationen">
<icon BUILTIN="pencil"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716914869721" ID="ID_756769385" MODIFIED="1716914902541" TEXT="basis-Allokation">
@ -81880,10 +81899,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716914886169" ID="ID_505410227" MODIFIED="1716914902542" TEXT="&#xc4;nderung Spread">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1716936092764" ID="ID_618217173" MODIFIED="1716936100479" TEXT="Objekte einzeln verschieben"/>
<node CREATED="1716936101233" ID="ID_1155209653" MODIFIED="1716936109052" TEXT="per std::memmove"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716914892972" ID="ID_1080699305" MODIFIED="1716914902543" TEXT="Platzieren neuer Daten">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716936138265" ID="ID_344813639" MODIFIED="1716936143886" TEXT="Allokations-Policies">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1716936150419" ID="ID_442325434" MODIFIED="1716936174356" TEXT="HeapOwn">
<node CREATED="1716936175678" ID="ID_1766388404" MODIFIED="1716936183114" TEXT="die C-Funktionen nutzen (wegen realloc)"/>
<node CREATED="1716936231944" ID="ID_1000807546" LINK="https://en.cppreference.com/w/cpp/memory/c/realloc" MODIFIED="1716936247901" TEXT="Doku std::realloc()">
<icon BUILTIN="info"/>
</node>
</node>
</node>
</node>
</node>
</node>