Library: draft memory rearrangements
not clear yet how to handle the classical "realloc" situation
This commit is contained in:
parent
feeee4096d
commit
2abbae77d7
2 changed files with 86 additions and 4 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -81870,6 +81870,25 @@ Date:   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<X> ist ein Several<const X>"/>
|
||||
</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ßerdem: es darf keine Verzeigerung geben">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1716937025743" ID="ID_323500560" MODIFIED="1716937028858" TEXT="zwei Fälle">
|
||||
<node CREATED="1716937029830" ID="ID_12032052" MODIFIED="1716937071076" TEXT="Spread geändert ⟶ 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ö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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716914886169" ID="ID_505410227" MODIFIED="1716914902542" TEXT="Ä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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue