diff --git a/src/lib/par/disposition.hpp b/src/lib/par/disposition.hpp
index 2c9ba36b0..b97dc5d66 100644
--- a/src/lib/par/disposition.hpp
+++ b/src/lib/par/disposition.hpp
@@ -55,12 +55,24 @@ namespace par {
template
+ ...und zwar unter der Vorgabe, daß es keine zu starken »Verrenkungen« erfordert und sich sicher im Rahmen des Standards bewegt (⟶ das ist letztlich gelungen; ich kann tatsächlich die zwei virtuellen Implementierungs-Medoden non-virtual aufrufen; habe sie nun auch als final markiert, um auf die latente Gefahr hinzuweisen)
+
...ich hatte es zwar definiert und im Container-Typ angegeben — aber dann im konkreten API-Aufbau doch nicht eingeschleift (weil es da thematisch ja auch nicht hingehört, Grrrr)
insofern dieses ganze clevere seitwärige Attachment überflüssig ist; die einzige zwingende Voraussetzung ist, daß wir eine VTable haben
weil PolymorphicValue da blindlings seinen ADMIN_OVERHEAD draufschlägt. Das ist ein sekundäres Problem im API-Design — wenn das Marker-API und der »workaround« mit dem Mix-in nicht mehr gebraucht werden, dann fällt auch diese ganze Verwirrung hier weg (die mich jetzt viele Stunden gekostet hat)
+ ....und dieser Code hier ist bereits jetzt verdammt komplex; ich bin unzufrieden mit der Anordnung der Typen — und so habe ich Sorge, daß eine solche »Hintertür« später zum Wartungsproblem wird
+
+ Man müßte dann permanent bedenken, daß sonst noch »jemand« von außen hereinpfuscht — das ist nicht wie man gute Software baut
+
+ Dieser Zugriff — unter korrekter Berücksichtigung der Automation — ist ausgesprochen der Kern meines Parameter-Konzepts, und daher dargestellt im Basis-Interface Provision::retrieveInto(ValBuff&) und Provision::setValFrom(ValBuff const&).
+
+ der Optimiser kann ggfs devirtualisieren — final hilft dabei
+
+ wie üblich, eine non-inline Funtkion definieren, also üblicherweise nimmt man dafür den dtor
+
+ ⟹ sehe daß die VTable 3 «slots» bekommt (in Clang und Gcc), einen "base object destructor" und einen "deleting destructor", und schließlich meine virtuelle test-funktion
+
+ Nachdem ich es geschafft habe, mich wieder etwas in x64-Assembler einzulesen....
+
+ ich WUßTE doch das es da irgend was gab, das sogar durch den Standard gedeckt ist
+
+ und unter O3: diese wird ge-inlined!
+
+ If the selected function is non-virtual, or if the id-expression in the class member access expression is a
+
+ qualified-id, that function is called. Otherwise, its final overrider (11.7.2) in the dynamic type of the object
+
+ expression is called; such a call is referred to as a virtual function call. [Note: The dynamic type is the type of
+
+ the object referred to by the current value of the object expression. 11.10.4 describes the behavior of virtual
+
+ function calls when the object expression refers to an object under construction or destruction. — end note
+
+ Fazit: keine Optimisation sondern man kann das direkt instruieren
+
ValStorage : ein konkreter ValBuff mit ausreichender Storage-size
+
+
+
+
+
+
+void hun(T* obj, class C* c)
+{
+ //do some checking on c
+ if (some conditions from c are true)
+ {
+ //call fun from T ignoring it's virtual
+ obj->T::fun(); // T::fun is a qualified-id }
+}
+ hab mich an der Stelle festgebissen und ganz stur reingebohrt, bis ich eine komplette Implementierungs-Skizze hatte, die alle erwarteten Elemente demonstriert +
+ + ++ sprachlich sauberer formuliert, aber auch etwas umständlicher, dafür stellenweise auch genauer. +
+ + ++ früher, für 8086 war das zwingend, da nur esp und ebp für relative Addressierung verwendet werden konnten. Seit 80386 können alle Register für relative Addressierung verwendet werden. Daher ist ebp (und rbp für 64bit) meist nur ein weiteres Register, das man nutzen kann. Allerdings generieren die meisten Compiler immer noch Code, der den »Funktions-Frame« in rbp halten (also das, wohin der Stack-Pointer zu Beginn der Funktion gezeigt hat). Code wird dadurch viel leichter lesbar, da alle lokalen Variablen einen festen Offset haben. Allerdings kann man rbp wegoptimieren und (fast) alles mit rsp allein machen — nur ändern sich dann auch die Offsets fortwährend. Es gibt allerdings eineige Speziallfälle, wo das schwierig bis unmöglich wird (hier werden immer wieder die »flexiblen Arrays« von C genannt) +
+ + ++ QWORD PTR ist insgesamt einfach historisch gewachsene Intel-Syntax; das "PTR" trägt selber keine Semantik, es macht die Instruktion nur besser lesbar. Daß es sich um eine Indirektion / Dereferenzierung handelt, geht aus den [...] hervor +
+ + ++ mov BYTE PTR [rbp-48], al ; 1 byte +
++ mov WORD PTR [rbp-48], ax ; 2 bytes +
++ mov DWORD PTR [rbp-48], eax ; 4 bytes +
++ mov QWORD PTR [rbp-48], rax ; 8 bytes +
++ +
+ + ++ (hier ein quad ≙ 64 bit) +
++ Erläuterung: die Dereferenzierung von [rbp - 48] liefert nur eine Speicheraddresse, sagt aber nicht, wie viele Bytes ab dieser Adresse als Operand genommen werden sollen. +
++ Beispiel: mov QWORD PTR [rbp-48], rax +
++ nimm den Inhalt von eax und speichere ihn an die indirekt gegebene Adresse in die dort folgenden 8byte +
++ Anmerkung: viele Assembler mit Intel-Syntax können diese Operanden-Längen auomatisch inferieren (z.B. NASM kann das); im gezeigten Beispiel geht ja aus dem quell-Operanden "rax" schon hervor, daß 64bit bewegt werden sollen. Andererseits, in AT&T-Syntax wird meistens ein Suffix an den Opcode angehängt, um die Operanden-Länge anzuzeigen. Das Beispiel würde dann also lauten (AT&T-Syntax): movq %rax, -48(%rbp) +
+ + +