diff --git a/src/lib/several.hpp b/src/lib/several.hpp index 20190c929..240992ba0 100644 --- a/src/lib/several.hpp +++ b/src/lib/several.hpp @@ -73,7 +73,7 @@ namespace lib { namespace {// Storage implementation details - template + template struct ArrayBucket { ArrayBucket (size_t bytes, size_t elmSize = sizeof(I)) @@ -91,9 +91,8 @@ namespace lib { Deleter deleter; /** mark start of the storage area */ - alignas(I) - alignas(void*) - std::byte storage[sizeof(I)]; + alignas(E) + std::byte storage[space]; static size_t diff --git a/tests/library/several-builder-test.cpp b/tests/library/several-builder-test.cpp index 9cab3780d..7359c91d5 100644 --- a/tests/library/several-builder-test.cpp +++ b/tests/library/several-builder-test.cpp @@ -28,6 +28,7 @@ #include "lib/test/run.hpp" #include "lib/test/tracking-dummy.hpp" +#include "lib/test/tracking-allocator.hpp" #include "lib/test/test-coll.hpp" #include "lib/test/test-helper.hpp" #include "lib/test/diagnostic-output.hpp"////////////////TODO @@ -508,6 +509,26 @@ namespace test{ alignas(32) char charm = 'u'; }; +SHOW_EXPR(sizeof(Ali)) +SHOW_EXPR(alignof(Ali)) +SHOW_EXPR(sizeof(ArrayBucket)) +SHOW_EXPR(alignof(ArrayBucket)) +SHOW_EXPR(sizeof(ArrayBucket)) +SHOW_EXPR(alignof(ArrayBucket)) +SHOW_EXPR(sizeof(ArrayBucket)) +SHOW_EXPR(alignof(ArrayBucket)) + + std::allocator> aliAllo; + std::allocator byteAllo; + + ArrayBucket * locAli = aliAllo.allocate(1); + std::byte* locByte = byteAllo.allocate(96); +SHOW_EXPR(loc(locAli)) +SHOW_EXPR(loc(locAli) % alignof(Ali)) +SHOW_EXPR(loc(locByte)) +SHOW_EXPR(loc(locByte) % alignof(Ali)) + aliAllo.destroy(locAli); + byteAllo.destroy(locByte); auto elms = makeSeveral().fillElm(5).build(); CHECK (5 == elms.size()); @@ -551,11 +572,18 @@ namespace test{ /** @test TODO demonstrate integration with a custom allocator - * @todo WIP 6/24 🔁 define ⟶ implement + * @todo WIP 6/24 🔁 define ⟶ 🔁 implement */ void check_CustomAllocator() { + { + auto builder = makeSeveral() + .withAllocator(); +SHOW_TYPE(decltype(builder)) +SHOW_EXPR(builder.size()) +SHOW_EXPR(builder.capacity()) + } } }; diff --git a/tests/library/test/test-tracking-test.cpp b/tests/library/test/test-tracking-test.cpp index cdff7c330..0d2b049dc 100644 --- a/tests/library/test/test-tracking-test.cpp +++ b/tests/library/test/test-tracking-test.cpp @@ -175,7 +175,7 @@ namespace test{ void demonstrate_checkAllocator() { - // setup a common lock for the tracking objects and -allocator + // setup a common event-log for the tracking objects and -allocator auto& log = TrackingAllocator::log; Tracker::log.clear("Tracking-Allocator-Test"); Tracker::log.joinInto(log); diff --git a/wiki/thinkPad.ichthyo.mm b/wiki/thinkPad.ichthyo.mm index b0840a7cc..6d33488f0 100644 --- a/wiki/thinkPad.ichthyo.mm +++ b/wiki/thinkPad.ichthyo.mm @@ -81799,7 +81799,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- + @@ -81884,8 +81884,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
- - + + @@ -81895,6 +81895,99 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + + + +

+ auf Basis der buffSiz, d.h. der Größe des reinen Nutzdatenpuffers; auf diese konnte man noch den statisch ermittelbaren Overhead aufschlagen +

+ + +
+
+ + + + + + +

+ Der Allocator macht nur eine raw-storage-Allocation, da is nix mit Alignment. Insofern kann der Beginn des gelieferten Speicherbereichs auch „daneben liegen“ — so daß wir einen Korrektur-Offset brauchen. Und der läßt sich nicht systematisch erschließen +

+ + +
+
+ + + + + + + + + + + +

+ Der Aufruf des Allokators erfolgt aus dem Builder, und an der Stelle ist ohne Weiteres der volle Typ konstelliert +

+ + +
+
+ + +
+
+ + + + + + + + + + + +

+ ...to allocate storage required for a single object whose alignment requirement exceeds __STDCPP_DEFAULT_NEW_ALIGNMENT__ +

+ + +
+
+ + + + + + + + + + +

+ ...weshalb ich ja keinen wirklich passenden statischen Typ für ArrayBucket angeben kann, weil die Puffergröße erst zur Laufzeit bekannt wird. +

+ + +
+
+
+ + + +
@@ -83725,8 +83818,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
Der Zweck der TrackingFactory ist es, das saubere Verhalten eines Custom-Allocators zu belegen. In Grenzfällen könnte das zwar auch Concurrency involvieren — jedoch ist es aus heutigem Verständnis generell nicht mehr üblich, Allokationen in der »heißen Zone« zu machen. Typischerweise verwendet man genau dafür einen Builder oder einen Pool und teilt die Ressourcen schon im Vorhinen den Threads zu.

- - +
@@ -84222,6 +84314,24 @@ Date:   Thu Apr 20 18:53:17 2023 +0200
+ + + + + + + + + +

+ Vorsicht Falle: der Allocator kann das gar nicht machen, wenn man ihm im Sinn von »placement new« explizit die Position vorgibt +

+ + +
+ +
+
@@ -129709,8 +129819,7 @@ std::cout << tmpl.render({"what", "World"}) << s wenn ein Allocator nur seine eignen Allokationen hanhaben soll ⟹ Gefahr

- - +