Library: work out Skeleton for memory-handling strategy
- the basic decision is to implement ''realloc'' similar to `std::vector` - however the situation is complicated by the desire to allow arbitrary element types - ⟹ must build a strategy based on the properties of the target type - the completely dynamic growth is only possibly for trivially-movable types - can introduce a dedicated ''element type'' though, and store a trampolin handler
This commit is contained in:
parent
2abbae77d7
commit
802fef9b7c
2 changed files with 281 additions and 39 deletions
|
|
@ -47,6 +47,7 @@
|
|||
#include "lib/iter-explorer.hpp"
|
||||
#include "lib/util.hpp"
|
||||
|
||||
#include <type_traits>
|
||||
#include <cstring>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
|
@ -69,13 +70,59 @@ namespace lib {
|
|||
UNIMPLEMENTED ("adjust memory allocation"); ///////////////////////////OOO Problem Objekte verschieben
|
||||
}
|
||||
};
|
||||
|
||||
using std::is_trivially_move_constructible_v;
|
||||
using std::is_trivially_destructible_v;
|
||||
using std::has_virtual_destructor_v;
|
||||
using std::is_same_v;
|
||||
using lib::meta::is_Subclass;
|
||||
|
||||
template<class I, class E>
|
||||
struct MemStrategy
|
||||
{
|
||||
bool disposable :1 ;
|
||||
bool wild_move :1 ;
|
||||
|
||||
template<typename TY>
|
||||
bool
|
||||
canDestroy()
|
||||
{
|
||||
return disposable
|
||||
or (is_trivially_destructible_v<TY> and is_trivially_destructible_v<I>)
|
||||
or (has_virtual_destructor_v<I> and is_Subclass<TY,I>())
|
||||
or (is_same_v<TY,E> and is_Subclass<E,I>());
|
||||
}
|
||||
|
||||
template<typename TY>
|
||||
bool
|
||||
canDynGrow()
|
||||
{
|
||||
return is_same_v<TY,E>
|
||||
or (is_trivially_move_constructible_v<TY> and wild_move);
|
||||
}
|
||||
|
||||
auto
|
||||
getDeleter()
|
||||
{
|
||||
if constexpr (disposable or
|
||||
(is_trivially_destructible_v<E> and is_trivially_destructible_v<I>))
|
||||
return nullptr;
|
||||
if constexpr (has_virtual_destructor_v<I>)
|
||||
return nullptr;
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap a vector holding objects of a subtype and
|
||||
* provide array-like access using the interface type.
|
||||
*/
|
||||
template<class I, class POL =HeapOwn>
|
||||
template<class I ///< Interface or base type visible on resulting Several<I>
|
||||
,class E =I ///< a subclass element element type (relevant when not trivially movable and destructible)
|
||||
,class POL =HeapOwn ///< Allocator policy
|
||||
>
|
||||
class SeveralBuilder
|
||||
: Several<I>
|
||||
, POL
|
||||
|
|
@ -121,7 +168,7 @@ namespace lib {
|
|||
adjustStorage (size_t cnt, size_t spread)
|
||||
{
|
||||
if (cnt*spread > storageSiz_)
|
||||
{// need more storage..
|
||||
{ // need more storage...
|
||||
Col::data_ = static_cast<typename Col::Bucket> (POL::realloc (Col::data_, storageSiz_, cnt*spread));
|
||||
storageSiz_ = cnt*spread;
|
||||
}
|
||||
|
|
@ -130,7 +177,7 @@ namespace lib {
|
|||
adjustSpread (spread);
|
||||
|
||||
if (cnt*spread < storageSiz_)
|
||||
{// attempt to shrink storage
|
||||
{ // attempt to shrink storage
|
||||
Col::data_ = static_cast<typename Col::Bucket> (POL::realloc (Col::data_, storageSiz_, cnt*spread));
|
||||
storageSiz_ = cnt*spread;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -81444,16 +81444,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1715620143727" ID="ID_828708828" MODIFIED="1715620159863" TEXT="Zugriff auf den Allocator per DI (statisch) oder Thread-local"/>
|
||||
<node CREATED="1715620242056" ID="ID_427769562" MODIFIED="1716856637040" TEXT="Spezieller Allocator mit Block-de-Allocation">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...man verwendet <i>nur speziell im produktiven Einsatz im Node-Graph</i>  einen besonderen Allocator, der zwar den Destruktor aufruft, aber den Speicher nicht freigibt; alloziert wird immer in einen kompakten Block hinein, der dann auf der Basis der Prozeß-Kenntnis als Ganzes verworfen und neu verwendet wird.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="forward"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -81680,16 +81677,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1716902524310" ID="ID_336186594" MODIFIED="1716902554166" TEXT="der Container selber ist runtime-polymorph">
|
||||
<node CREATED="1716902559461" ID="ID_796780489" MODIFIED="1716902593125">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Konsequenz: man kann einen einzigen Typ <font face="Monospaced" color="#8c0808">Several<X></font> anschreiben
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1716902606624" ID="ID_1870642120" MODIFIED="1716902710954" TEXT="alle Detail-Variationen sind als runtime state gegeben">
|
||||
<linktarget COLOR="#4b357c" DESTINATION="ID_1870642120" ENDARROW="Default" ENDINCLINATION="106;163;" ID="Arrow_ID_1077333305" SOURCE="ID_324116912" STARTARROW="None" STARTINCLINATION="-291;19;"/>
|
||||
|
|
@ -81750,42 +81744,33 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1716902202186" ID="ID_1015798898" MODIFIED="1716902275921" TEXT="Diskussion">
|
||||
<node CREATED="1716902205235" ID="ID_1941027730" MODIFIED="1716902274648" TEXT="wir verschwenden Storage zur Performance-Optimierung">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und zwar vor allem durch den AllocationCluster mit einer festen Extent-Size. Vorhersehbar werden die Extents meist zu groß sein...
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1716902277551" ID="ID_1279637635" MODIFIED="1716902337377" TEXT="Extents sind überdimensioniert ⟹ Platz ist „eh da“">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und was noch besser ist: die Storage liegt kompakt
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1716902347758" ID="ID_737951964" MODIFIED="1716902457937" TEXT="Zusätzliche Typ-Komplexität dagegen wäre problematisch">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...weil wir durch den Connectivity-Descriptor bereits eine gefährlich komplexes Stück Metaprogramming haben, mit dem Risiko kombinatorischer Explosion
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1716902466150" ID="ID_1670357749" MODIFIED="1716902481998" TEXT="Entscheidung �� Ziel-B präferieren">
|
||||
|
|
@ -81820,16 +81805,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1716905326312" ID="ID_1705639100" MODIFIED="1716905341332" TEXT="wegen ownership"/>
|
||||
<node CREATED="1716905342344" ID="ID_36544498" MODIFIED="1716905416848" TEXT="für unmanaged ArrayBuckets könnte man eine cloneCopy-Funktion bereitstellen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
diese Funktion würde eine Exception werfen, wen das ArrayBucket eben doch ownership-managed ist. Ansonsten erzeugt sie eine neue Instanz mit Verweis auf das gemeinsam nutzbare Bucket
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -81851,16 +81833,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1716912163674" ID="ID_581123494" MODIFIED="1716912528793" TEXT="muß hier einen offenen Zugriff hinter das Objektende machen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...weil ich den Zieltyp zum Cast nicht dynamisch konstruieren kann
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -81885,8 +81864,224 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<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?">
|
||||
<node COLOR="#435e98" CREATED="1716937163164" ID="ID_1513844512" MODIFIED="1717536682524" TEXT="wie geht std::vector damit um?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1716990764896" ID="ID_1932292038" MODIFIED="1716990768697" TEXT="Code lesen...">
|
||||
<node CREATED="1716990770901" ID="ID_765989351" MODIFIED="1716990794828" TEXT="resize() ⟶ _M_default_append(size_type n)">
|
||||
<node CREATED="1716991624080" ID="ID_1771047546" MODIFIED="1716991629388" TEXT="wenn avail > n">
|
||||
<node CREATED="1716991641557" ID="ID_1450865359" MODIFIED="1716991679022" TEXT="std::__uninitialized_default_n_a(M_finish, n, _M_get_Tp_allocator());"/>
|
||||
<node CREATED="1716992445613" ID="ID_1704671492" MODIFIED="1716992457319" TEXT="füllt den Raum mit default-konstruierten Objekten"/>
|
||||
</node>
|
||||
<node CREATED="1716991743675" ID="ID_493415039" MODIFIED="1716991747421" TEXT="sonst: wachsen">
|
||||
<node CREATED="1716991748441" ID="ID_256826617" MODIFIED="1716992082953" TEXT="neue Länge len wird begrenzt durch max_size()"/>
|
||||
<node CREATED="1716992284010" ID="ID_1754313988" MODIFIED="1716992301026" TEXT="komplett neue Allokation der Länge len"/>
|
||||
<node CREATED="1716992476761" ID="ID_243565315" MODIFIED="1716999069060" TEXT="std::__uninitialized_move_if_noexcept_a(_M_start, _M_finish, __new_start, _M_get_Tp_allocator());">
|
||||
<linktarget COLOR="#a9b4c1" DESTINATION="ID_243565315" ENDARROW="Default" ENDINCLINATION="13;99;" ID="Arrow_ID_855653708" SOURCE="ID_945905429" STARTARROW="None" STARTINCLINATION="322;21;"/>
|
||||
<node CREATED="1716994640256" ID="ID_90966765" MODIFIED="1716994650467" TEXT="macht move oder copy-Initialisierung"/>
|
||||
<node CREATED="1716994659143" ID="ID_423406724" MODIFIED="1716994693125" TEXT="und zwar abhängig vom Zieltyp"/>
|
||||
<node CREATED="1716994713872" ID="ID_237185972" MODIFIED="1717536660362" TEXT="__make_move_if_noexcept_iterator(IT_i)">
|
||||
<linktarget COLOR="#47a78d" DESTINATION="ID_237185972" ENDARROW="Default" ENDINCLINATION="-91;252;" ID="Arrow_ID_1124696583" SOURCE="ID_1567771113" STARTARROW="None" STARTINCLINATION="674;41;"/>
|
||||
<node CREATED="1716996255516" ID="ID_764291516" MODIFIED="1716996262166" TEXT="ist eigentlich nur ein std::__uninitialized_copy_a">
|
||||
<node CREATED="1716996369943" ID="ID_768726808" MODIFIED="1716996375716" TEXT="verwendet den Allocator"/>
|
||||
<node CREATED="1716996376265" ID="ID_1255436974" MODIFIED="1716996387523" TEXT="...um am Ziel eine neue Instanz zu kopieren"/>
|
||||
<node CREATED="1716996388079" ID="ID_1637885085" MODIFIED="1716996401929" TEXT="und übergibt ihr eiene Quell-Referenz"/>
|
||||
</node>
|
||||
<node CREATED="1716996264080" ID="ID_1192115542" MODIFIED="1716996280169" TEXT="aber packt den Pointer/Iterator um"/>
|
||||
<node CREATED="1716995032097" ID="ID_1249947729" MODIFIED="1716996254025" TEXT="siehe auch: std::move_if_noexcept">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Same as std::move unless the type's move constructor could throw and the type is copyable, in which case an lvalue-reference is returned instead.
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1716994797739" ID="ID_274768762" MODIFIED="1716996262173" TEXT="__move_if_noexcept_cond<value_type>">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
<font color="#531e64" face="Monospaced">__and_</font><font face="Monospaced"><</font><font color="#92250f" face="Monospaced">__not_</font><font face="Monospaced"><<b>is_nothrow_move_constructible</b><_Tp>> </font>
|
||||
</p>
|
||||
<p>
|
||||
<font face="Monospaced">      , <b>is_copy_constructible</b><_Tp>></font>
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1716995184520" ID="ID_983904351" MODIFIED="1716995189899" TEXT="beachte die negative Formulierung"/>
|
||||
<node CREATED="1716995193759" ID="ID_1454052596" MODIFIED="1716995200465" TEXT="der else-Fall ist das was wir eigentlich wollen"/>
|
||||
</node>
|
||||
<node CREATED="1716994739339" ID="ID_1646764235" MODIFIED="1716996213029" TEXT="std::move_iterator<IT>">
|
||||
<font BOLD="true" NAME="SansSerif" SIZE="12"/>
|
||||
<node CREATED="1716996108212" ID="ID_1222273534" MODIFIED="1716996113144" TEXT="verpackt einen STL iterator"/>
|
||||
<node CREATED="1716996114228" ID="ID_1307025033" MODIFIED="1716996132093" TEXT="aber erzeugt eine RValue-Referenz bei Derefernzierung"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1716999072506" ID="ID_563103052" MODIFIED="1716999079516" TEXT="und dann alte Elemente zerstören"/>
|
||||
<node CREATED="1716999080080" ID="ID_521884628" MODIFIED="1716999084108" TEXT="alten Block deallozieren"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1716996537916" ID="ID_439873587" MODIFIED="1716996542495" TEXT="emplace_back(args...)">
|
||||
<node CREATED="1716996778603" ID="ID_1854948949" MODIFIED="1716996788230" TEXT="if (_M_finish != _M_end_of_storage)">
|
||||
<node CREATED="1716996854833" ID="ID_1856123255" MODIFIED="1716996855557" TEXT="_Alloc_traits::construct"/>
|
||||
</node>
|
||||
<node CREATED="1716996789019" ID="ID_1418564015" MODIFIED="1716996815527">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
sonst: _M_<b>realloc</b>_insert
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<node CREATED="1716997373227" ID="ID_626493899" MODIFIED="1716997385838" TEXT="auch hier: wachsen durch Umkopieren"/>
|
||||
<node CREATED="1716997392113" ID="ID_59655719" MODIFIED="1716997406779" TEXT="neue Länge per Inkrement und begrenzt druch max_size()"/>
|
||||
<node CREATED="1716999036887" ID="ID_1798375981" MODIFIED="1716999045585" TEXT="alloziert einen Block der neuen Länge"/>
|
||||
<node CREATED="1716999046173" ID="ID_1721108534" MODIFIED="1716999053431" TEXT="platziert ganz ans Ende das neue Element"/>
|
||||
<node CREATED="1716999054009" ID="ID_945905429" MODIFIED="1716999069060" TEXT="danach std::__uninitialized_move_if_noexcept_a">
|
||||
<arrowlink DESTINATION="ID_243565315" ENDARROW="Default" ENDINCLINATION="13;99;" ID="Arrow_ID_855653708" STARTARROW="None" STARTINCLINATION="322;21;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1717536199658" ID="ID_1563046053" MODIFIED="1717536544630" TEXT="Fazit">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1717536203729" ID="ID_105709507" MODIFIED="1717536524915" TEXT="verwendet kein realloc">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
die C-Funktion <font face="Monospaced">realloc()</font> kann zwar scheinbar „zaubern“, ist aber tatsächlich auf Hilfe vom Allokator angewiesen, insofern dieser sich intern gewisse zusätzliche Reserven sichert. Und wenn seine Resevern nicht reichen, dann wird sofort woanders alloziert und alles per <font face="Monospaced">memmove()</font>  umkopiert....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1717536217204" ID="ID_248984018" MODIFIED="1717536532662" TEXT="...sondern erzeugt das gleiche Verhalten direkt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Tatsächlich kann <font face="Monospaced">std::vector()</font> dasselbe besser machen, da er ggfs move-Konstruktoren aufrufen und außerdem als zusätzliche Heuristik die aktuelle Größe des Vektors heranziehen kann, um eine angemessene Reserve bereitzustellen; außerdem ist die Größe der Reserve direkt auf das API herausgeführt.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</node>
|
||||
<node CREATED="1717536629978" ID="ID_1567771113" MODIFIED="1717536675032" TEXT="Hilfsmittel: Typ-Weiche und std::move_iterator">
|
||||
<arrowlink COLOR="#47a78d" DESTINATION="ID_237185972" ENDARROW="Default" ENDINCLINATION="-91;252;" ID="Arrow_ID_1124696583" STARTARROW="None" STARTINCLINATION="674;41;"/>
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717536689923" ID="ID_57717387" MODIFIED="1717536696459" TEXT="Also: das können wir auch">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1717536711508" ID="ID_1202794334" MODIFIED="1717536719580" TEXT="und zwar zweischichtig">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1717536720952" ID="ID_438837024" MODIFIED="1717536735768" TEXT="Reserve-oder-Verschieben"/>
|
||||
<node CREATED="1717536736572" ID="ID_489657411" MODIFIED="1717536754798" TEXT="ggfs Zusammenspiel mit dem AllocationCluster"/>
|
||||
<node CREATED="1717536777230" ID="ID_305862937" MODIFIED="1717536801703" TEXT="max-size: hier ggfs durch den Allocation-Cluster vorgegeben"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1717538242090" ID="ID_1593041374" MODIFIED="1717538261355" TEXT="Zielkonflikt ↯">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1717538269574" ID="ID_417300580" MODIFIED="1717538300972" TEXT="beliebige Sub-Typen variabler Größe handhaben"/>
|
||||
<node CREATED="1717538301896" ID="ID_1296824039" MODIFIED="1717538399557" TEXT="re-Alloc-Verschiebung sauber via move-Konstruktor machen"/>
|
||||
<node COLOR="#5b280f" CREATED="1717538517882" ID="ID_452753064" MODIFIED="1717538534861" TEXT="wir kennen den konkreten Typ in der einzelnen Zelle nicht">
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
<node CREATED="1717538661570" ID="ID_527938373" MODIFIED="1717541267684" TEXT="mögliche Lösungen">
|
||||
<icon BUILTIN="idea"/>
|
||||
<node COLOR="#5b280f" CREATED="1717538745353" ID="ID_79141441" MODIFIED="1717541282563" TEXT="dynamisches realloc nur für den Basis-Typ erlauben">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1717541285939" ID="ID_873094921" MODIFIED="1717541307763" TEXT="das wäre einfach">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
<node CREATED="1717541293868" ID="ID_95354963" MODIFIED="1717541301594" TEXT="aber auch überraschend restriktiv">
|
||||
<icon BUILTIN="closed"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1717539082925" ID="ID_1310049828" MODIFIED="1717541322799" TEXT="einen Element-Typ statisch für den Builder definieren">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1717541325558" HGAP="22" ID="ID_1092966052" MODIFIED="1717541339056" TEXT="das ist auf jeden Fall machbar!" VSHIFT="2">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1717539256053" ID="ID_1258614171" MODIFIED="1717539267615" TEXT="Typhandler-Trampolin bauen">
|
||||
<node CREATED="1717539290144" ID="ID_1487591003" MODIFIED="1717539297755" TEXT="stellt den Deleter bereit"/>
|
||||
<node CREATED="1717539298319" ID="ID_1107472699" MODIFIED="1717539362752" TEXT="sowie einen Move-Handler"/>
|
||||
<node CREATED="1717539382219" ID="ID_1846112682" MODIFIED="1717539408547" TEXT="kann (abhängig vom Typ) auf memmove zurückfallen"/>
|
||||
</node>
|
||||
<node CREATED="1717539527558" ID="ID_664027664" MODIFIED="1717539604663" TEXT="erweiterte Flexibilität nur im Einzelfall">
|
||||
<node CREATED="1717539630550" ID="ID_1134893118" MODIFIED="1717539634513" TEXT="Bedingungen">
|
||||
<node CREATED="1717539636925" ID="ID_1442794254" MODIFIED="1717540858927" TEXT="Deleter">
|
||||
<linktarget COLOR="#d90152" DESTINATION="ID_1442794254" ENDARROW="Default" ENDINCLINATION="2;12;" ID="Arrow_ID_92396700" SOURCE="ID_1347402773" STARTARROW="None" STARTINCLINATION="-2;-10;"/>
|
||||
<node CREATED="1717539729616" ID="ID_1305258499" MODIFIED="1717539743649" TEXT="global disposable oder unmanaged ⟹ keiner"/>
|
||||
<node CREATED="1717539852917" ID="ID_1428257938" MODIFIED="1717543030532" TEXT="∨ Basistyp und konkreter Typ sind trivially destructible"/>
|
||||
<node CREATED="1717539745205" ID="ID_222469132" MODIFIED="1717544076400" TEXT="∨ Basistyp hat virtuellen Deleter und Typ ist Subklasse"/>
|
||||
<node CREATED="1717540047343" ID="ID_1258092354" MODIFIED="1717544130652" TEXT="∨ Typ ≡ Element-Typ und erbt von Basistyp"/>
|
||||
</node>
|
||||
<node CREATED="1717539954701" ID="ID_1347402773" MODIFIED="1717540865774" TEXT="Construct">
|
||||
<arrowlink COLOR="#d90152" DESTINATION="ID_1442794254" ENDARROW="Default" ENDINCLINATION="2;12;" ID="Arrow_ID_92396700" STARTARROW="None" STARTINCLINATION="-2;-10;"/>
|
||||
<node CREATED="1717540047343" ID="ID_305565585" MODIFIED="1717540069682" TEXT="Typ ≡ Element-Typ"/>
|
||||
<node CREATED="1717540103214" ID="ID_472317796" MODIFIED="1717540293613" TEXT="∨ Allokation mit ausreichendem Spread vorhanden"/>
|
||||
<node CREATED="1717540387010" ID="ID_1163213959" MODIFIED="1717540975821" TEXT="∨ Typ und Element-Typ trivial verschiebbar"/>
|
||||
</node>
|
||||
<node CREATED="1717540310958" ID="ID_791166795" MODIFIED="1717540323111" TEXT="DynGrow">
|
||||
<node CREATED="1717540047343" ID="ID_794635351" MODIFIED="1717540069682" TEXT="Typ ≡ Element-Typ"/>
|
||||
<node CREATED="1717540387010" ID="ID_1189081540" MODIFIED="1717540975821" TEXT="∨ Typ und Element-Typ trivial verschiebbar"/>
|
||||
</node>
|
||||
<node CREATED="1717540316029" ID="ID_1546901658" MODIFIED="1717540318873" TEXT="Adjust">
|
||||
<node CREATED="1717540387010" ID="ID_691327613" MODIFIED="1717545362426" TEXT="wild-move-Flag gesetzt"/>
|
||||
</node>
|
||||
<node CREATED="1717541455144" ID="ID_365666724" MODIFIED="1717541467717" TEXT="Shrink">
|
||||
<node CREATED="1717541474460" HGAP="21" ID="ID_1811348621" MODIFIED="1717541492875" TEXT="rein an den Allokator delegiert" VSHIFT="4">
|
||||
<font ITALIC="true" NAME="SansSerif" SIZE="11"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1717541052496" ID="ID_1993251533" MODIFIED="1717541058707" TEXT="Prüfreihenfolge">
|
||||
<node CREATED="1717541059695" ID="ID_1168624181" MODIFIED="1717541072002" TEXT="zunächst muß der Deleter geklärt sein"/>
|
||||
<node CREATED="1717541083253" ID="ID_1635051454" MODIFIED="1717541091203" TEXT="der Deleter wird niemals geändert"/>
|
||||
<node CREATED="1717541160635" ID="ID_255264045" MODIFIED="1717541168910" TEXT="bestehende Allokation ausreichend"/>
|
||||
<node CREATED="1717541095619" ID="ID_1619642524" MODIFIED="1717545388181" TEXT="Element-Typ trivial verschiebbar ⟹ wild-move-Flag setzen"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717542409083" ID="ID_252983857" MODIFIED="1717542417791" TEXT="Strategy aufbauen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717542814132" ID="ID_1446789676" MODIFIED="1717542831827" TEXT="komplett vom Allokator trennen!">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node CREATED="1717542588800" ID="ID_1355622101" MODIFIED="1717542604293" TEXT="Prädikate">
|
||||
<node CREATED="1717542623647" ID="ID_749518164" MODIFIED="1717542633699" TEXT="canDestroy<TY>"/>
|
||||
<node CREATED="1717542661348" ID="ID_1155347834" MODIFIED="1717545239426" TEXT="canDynGrow<TY>"/>
|
||||
<node CREATED="1717542702415" ID="ID_1473880478" MODIFIED="1717545646724" TEXT="canAdjust ⟵ wild-move-Flag"/>
|
||||
</node>
|
||||
<node CREATED="1717543060128" ID="ID_1973537913" MODIFIED="1717543071098" TEXT="Handler">
|
||||
<node CREATED="1717543072032" ID="ID_1791379026" MODIFIED="1717543076568" TEXT="getDeleter()">
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1717546372010" ID="ID_231852526" MODIFIED="1717546386695" TEXT="klären: wie wird er konkret vernendet?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1717546388726" ID="ID_1089262988" MODIFIED="1717546407495" TEXT="muß einen Pointer auf ein Trampolin speichern können"/>
|
||||
<node CREATED="1717546408121" ID="ID_1274735212" MODIFIED="1717546425197" TEXT="muß den Allokator mit einbinden">
|
||||
<node CREATED="1717546597442" ID="ID_1158247490" MODIFIED="1717546607338" TEXT="⟹ Trampolin muß von Allokator erben"/>
|
||||
<node CREATED="1717546480353" ID="ID_1419974412" MODIFIED="1717546493220" TEXT="Problem : Trampolin für Allokator-Instanz">
|
||||
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1717546661817" ID="ID_999124001" MODIFIED="1717546671561" TEXT="wir haben NUR einen Pointer in der Storage vorgesehen">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1717546728089" ID="ID_549532304" MODIFIED="1717546740840" TEXT="wer verwaltet dann die Allokator-Instanz?">
|
||||
<icon BUILTIN="help"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1717543083078" ID="ID_530261806" MODIFIED="1717543114805" TEXT="getMover()"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1716914864769" ID="ID_966642586" MODIFIED="1716914906125" TEXT="Builder-Operationen">
|
||||
|
|
|
|||
Loading…
Reference in a new issue