Effiziente Polymorphie

Bekommst du es ohne eine VMT als Member des Objekts hin, auch ok.
Aber der Standard sieht es ja nicht vor, oder?

Oder gibt es einen Compiler, der entsprechend abstrahieren kann? Der Compiler müsste ja sicher sein können, und der Standard bietet kein Keyword, womit der Entwickler eine Garantie aussprechen könnte, dass er keine VMT braucht.
Ich müsste wohl mal einen Benchmark schreiben, um die Auswirkungen von VMTs im Vergleich zu statischen Klassen zu testen.

Wenn ich ihn habe, stelle ich die Resultate hier rein.

Gruss
cwriter
 
Der Standard sieht was nicht vor? Etwas ohne VMT lösen zu können? Der Standard kennt VMTs gar nicht.
Wie die virtual-Funktionalität umgesetzt wird bleibt ganz dem Compilerhersteller überlassen.
(nur kenn ich keinen, der es anders macht).

Da der Standard keine VMTs kennt gibt es auch keine Keywords zu VMTs.

Und es wäre auch kontrapoduktiv. Wie schon oft gesagt gibt es bei einer VMT-Umsetzung
von virtual ziemlich nie die Möglichkeit, die VMT wegzulassen. Ein Keyword, das dazu
zwingt, müsste einen Compilerfehler erzeugen.

C++ ist eine relativ schnelle Sprache, und so absichtliche Verlangsamungen werden deshalb
in Kauf genommen, weil a) die Vorteile die Nachteile bei Weitem überwiegen oder b) es keine
andere sinnvolle Möglichkeit gibt. Wenn ein Programm wegen VMTs zu langsam wird
muss man wohl auf Vererbung verzichten.
 
Der Standard sieht was nicht vor? Etwas ohne VMT lösen zu können? Der Standard kennt VMTs gar nicht.
Wie die virtual-Funktionalität umgesetzt wird bleibt ganz dem Compilerhersteller überlassen.
(nur kenn ich keinen, der es anders macht).
Also ist's ein Defacto-Standard, da viele Compilerhersteller ja bei der Standardisierung mitwirken.

Zu meinem schnell zusammengeschusterten Benchmark:
Zuerst die Resultate: Überaschenderweise kann der Compiler (VS 14.0 und VS 12.0 getestet) inlinen und somit sind statische und virtuelle Klassen bzw. ihre Memberfunktionen gleich schnell. Allerdings kann die statische immer inline eingefügt werden; das Inlining der virtuellen Funktion geht nur, wenn die Klasse by value und nicht bei reference übergeben wird. Das heisst:
C++:
VMTClass vc;
vc.func(...); //Inline
VMTClass& ref = vc;
ref.func(...); //Nicht inline
VMTClass* ptr = new VMTClass();
ptr->func(...); //Nicht inline
Ich schätze mal, dass der Optimizer beim Funktionsaufruf auf die Instanz genau wissen kann, welches Objekt jetzt gemeint ist, während er nicht wissen kann, was genau sich hinter dem Pointer verbirgt, wenn es sich nur um eine Referenz handelt.

Auch wenn die VMT nie gebraucht wird (durch inlining), bleibt sie bestehen und braucht dadurch mehr Speicherplatz als das statische Äquivalent.

C++ ist eine relativ schnelle Sprache, und so absichtliche Verlangsamungen werden deshalb
in Kauf genommen, weil a) die Vorteile die Nachteile bei Weitem überwiegen oder b) es keine
andere sinnvolle Möglichkeit gibt. Wenn ein Programm wegen VMTs zu langsam wird
muss man wohl auf Vererbung verzichten.
Ich weiss nicht so recht. Zum einen bietet C++ ja gerade mit inlining teilweise mehr Performance als C (hat ein gewisser Bjarne S. (Name der Redaktion bekannt) mal an einer Konferenz am Beispiel von std::qsort gezeigt). C kann das natürlich gleich schnell, wenn man es denn auf sich nehmen und für jede qsort-Anwendung eine neue Funktion schreiben will. So gesehen ist es da praktischer und schneller. Es gibt von Herb Sutter dazu das Zitat, dass es einfach sei, kurzen und schnellen, aber schwierig, langen und schnellen Code zu Lösung eines Problems in C++ zu schreiben (im Gegensatz zu anderen Programmiersprachen), das ich gerade nicht mehr finde :(
Und dann mit dem eigentlichen Zweck von C++ (den Klassen) wieder Geschwindigkeit zu verlieren, ist ein bisschen ironisch.

Aber vielleicht sehe ich das ja zu eng und für Mikrocontroller braucht man sowieso C und nicht C++ und beim Rest kommt's nicht so darauf an (ob der User nun 0.3 ms mehr oder weniger auf seine Website wartet ist nicht wirklich relevant).
Auf der anderen Seite gibt es ja für alle, die Bequemlichkeit beim Entwickeln über Performance zur Laufzeit stellen noch die managed languages, die nicht nur Polymorphie sehr gut können, sondern auch andere Vorteile wie z.B. für die GUI-Entwicklung mit sich bringen.

Aber das Standardisierungskomitee weiss hoffentlich schon, was es tut. Ich finde ja nur, dass ein Keyword, um dem Compiler / Optimizer inlining oder zumindest statische Funktionsaufrufe und die Entfernung der VMT zu erlauben, nicht schaden würde. Die Compiletime bliebe etwa gleich und die Runtime wird nicht langsamer. Zu verlieren hätte man nichts ausser die Standardisierungszeit.

Gruss
cwriter
 

Anhänge

Also was qsort jetzt mit VMTs zu tun hat ist mir nicht ganz klar... überspring ich.

Und dann mit dem eigentlichen Zweck von C++ (den Klassen) wieder Geschwindigkeit zu verlieren, ist ein bisschen ironisch.
Wir drehen uns jetzt offiziell im Kreis. Hast du eine Lösung für virtuell vererbte Methoden,
die a) nicht langsamer als ein ganz normaler Funktionsaufruf ist und b) die es erlaubt,
diese Methoden und Objekte allgemein auch in anderen Kompilierungseinheiten zu verwenden?
Nein? Eben.

Auf der anderen Seite gibt es ja für alle, die Bequemlichkeit beim Entwickeln über Performance zur Laufzeit stellen noch die managed languages, die nicht nur Polymorphie sehr gut können, sondern auch andere Vorteile wie z.B. für die GUI-Entwicklung mit sich bringen.

Und dein Argmuent von Managed-Sprachen ist auch keins. Was heißt "sehr gut können"?
Kanns C++ nicht? Und zB. Java ist deutlich eingeschränkter bei den Vererbungsmöglichkeiten
(nicht-virtual ist unmöglich, keine Mehrfachvererbung usw.usw.). Java ist weiters in der
Praxis in 99.999% der Fälle langsamer...

GUI-Entwicklung hat zwar mit der Sache nichts zu tun, aber auch
da hat Java etc. nichts, was C++ nicht auch kann.

Ich finde ja nur, dass ein Keyword, um dem Compiler / Optimizer inlining oder zumindest statische Funktionsaufrufe und die Entfernung der VMT zu erlauben, nicht schaden würde.
:rolleyes: Wenn du mir nicht glaubst kannst du dir gern andere Meinungen einholen...
Es ist nicht möglich, die VMT speicherplatzmäßig zu entfernen, weil dann
alles kaputtgeht (spätestens, wenn das Programm aus mehr als einer cpp-Datei besteht)
Mehr dazu auf der vorigen Seite des Threads.

Und einzelne Funktionsaufrufe nach Möglichkeit ohne Lookup zu realisieren,
für die Geschwindigkeit, passiert doch schon längst.
 
Aaalso ich hatte hier zu einer riesigen Antwort angesetzt; Edge ist gecrasht, der Editor gibt mir keine alte Version des Textes und ich habe keine Lust mehr, alles nochmals aufzuschreiben. Daher mal in Kurzform:
C++:
class Base //VMT
{
public:
    virtual void func();

    int i;
};

class VMTD : public Base //VMT
{
public:
    void func() override;
};

[direct/anderes, neues Keyword] class NoVMTD : public Base //Keine VMT
{
public:
    void func() override;
};

sizeof(Base) == sizeof(void*) + sizeof(int);
sizeof(VMTD) == sizeof(void*) + sizeof(int);
sizeof(NoVMTD) == sizeof(int);

Base b;
b.func(); //Base::Func() über VMT/fnCall/inline
VMTD v;
v.func(); //VMTD::Func() über VMT/fnCall/inline
((Base)v).func(); //VMTD::Func() über VMT/fnCall/inline
NoVMTD nv;
nv.func(); //NoVMTD::Func() über fnCall/inline
((Base)nv).func(); //Base::Func() über fnCall/inline
Das Keyword "direct" (oder ein anderes) schliesst aus, dass der Compiler es nicht kennen kann - der Programmierer gibt dem Compiler das Versprechen, dass er keine VMT braucht. Sollte dieses Versprechen gebrochen werden, fliegt einem das Programm halt um die Ohren. Ansonsten wird der Compiler jeden Aufruf der Memberfunktionen entweder als fnCall oder inline benutzen (anders als in meinem letzten Post: Wie gesagt werden da nur die Funktionen, die direkt auf die Instanz gewirkt werden, optimiert. Bei Pointern nicht. Das könnte durch ein Keyword behoben werden).

Auf das andere wollte ich wie gesagt auch noch eingehen, aber 1. schreibe ich jetzt schon eine Stunde und werde müde und 2. bringt es ja wohl eh nix.

Und einzelne Funktionsaufrufe nach Möglichkeit ohne Lookup zu realisieren,
für die Geschwindigkeit, passiert doch schon längst.
Siehe im Benchmark-Code und meine Ausführungen: Es könnte mehr optimiert werden, wenn der Compiler sicher sein könnte. Und diese Sicherheit kann ihm nur der Programmierer geben.

Gruss
cwriter
 
In deinem Beispiel hat sich ein Fehler eingeschlichen.
Falsch:
C++:
VMTD v;
v.func(); //VMTD::Func() über VMT/fnCall/inline
((Base)v).func(); //VMTD::Func() über VMT/fnCall/inline
Richtig:
C++:
VMTD v;
v.func(); //VMTD::Func() über VMT/fnCall/inline
((Base)v).func(); //Base::Func()  <-- Base
Prüfbar hier: http://ideone.com/MRJNa4
...ohne Pointer/Referenzen ist es komplett egal, ob etwas virtual ist oder nicht.

...
Ja, man könnte ein Keyword machen, dass dem Compiler verspricht, dass alles ohne VMT
möglich ist. Dafür hat man als Programmierer gewaltige Einschränkungen. Na Gut.
Ja, es könnte evt. sogar einen Compiler geben, der 100% der Situationen, die ein Mensch
ohne VMT lösen könnte, auch ohne VMT schafft. Zumindest deutlich schwerer als man denkt.
(...und irgendwie spür ich da das Halting-Problem dahinter)

...und dann?
Wenn sowieso in jeder Situation die Wahl der Funktion eindeutig ist könnte man das
ganze virtual und "direct" weglassen und einfach die richtige Funktion selber aufrufen...
(und hat dafür keine Einschränkungen)

...
Naja. Ich frag mich gerade, warum diese ganze Diskussion stattfindet :)
 
Das Keyword "direct" (oder ein anderes) schliesst aus, dass der Compiler es nicht kennen kann - der Programmierer gibt dem Compiler das Versprechen, dass er keine VMT braucht.

Kann man nicht, da das Konzept VMT im Standard nicht definiert ist. Der Standard sieht auch nicht vor, dass durch virtuelle Funktionen ein Overhead ensteht, daher ist es auch nicht nötig, dass man das im Standard adressiert. Die Lösung über ein Keyword wie beschrieben find ich nicht in Ordnung. Ein Keyword der Gattung "probier mal, wird schon schief gehen" kann man nicht in einen Standard aufnehmen.

Ich hatte bereits früher erwähnt, dass hier im konkreten Falle von VMTs es nicht die Kindklasse ist die entscheidet, ob selbige nötig ist sondern die Basisklasse(n). Wenn es in der Basisklasse virtuelle Funktionen gibt ist eine VMT immer nötig, sonst kann jemand, der einen Pointer auf die Basisklasse verwendet ja gar nicht wissen, was passiert. Zudem verstehe ich jetzt auch nicht warum in deiner zweiten Klasse keine VMT nötig sein soll.

C++:
void foo(Base* base) {
    base->func();
}

VMTD vmtd;
NoVMTD noVmtd;
foo(&vmtd);
foo(&noVmtd);

Wie unterschieden sich die beiden Aufrufe an foo? Woher weiss foo wie es func aufrufen muss wenn es ein mal mit und ein mal ohne VMT arbeitet?

Wie gesagt werden da nur die Funktionen, die direkt auf die Instanz gewirkt werden, optimiert. Bei Pointern nicht. Das könnte durch ein Keyword behoben werden.

Nein, kann es nicht. Ein Objekte, dass weder Pointer- noch Referenztyp ist, ist nicht polymorph. Der Typ muss komplett vorhanden sein und zu Kompilierzeit bekannt sein.
((Base)v).func();//Base::Func() <-- Base

Macht mehr als nur das, eigentlich ist das folgender Code:
Base b = v;
b.func();

Es wird der Copy-Konstruktor von Base aufgerufen, da ja v ein Base ist und daher auch als Argument für Base::Base(const Base&) verwendet werden kann. Mach rein:
Base(const Base& other) = delete;

Und du bekommst:
..\Main.cpp(26): error C2280: 'Base::Base(const Base &)': attempting to reference a deleted function

Bei ((Base) v)

Bei eine Pointer- oder Referenztypen ist das ganz anders. Der Laufzeittyp ist zu diesem Zeitpunkt nicht bekannt, also muss davon ausgegangen werden, dass es irgendwas sein kann. Alles andere wäre viel zu riskant.
 
Danke für die Rückendeckung :)

Bezüglich Codebeispiel:
"Wenn" alles Nötige in der selben Kompilierungseinheit ist, Klassenobjekte nie zwischen
KEs herumwandern, die Funktion daher auch von nirgendwo sonst aufgerufen wird,
und der Compiler evt. noch Haltingprobleme lösen kann, würds ja evt. gehen ( :) )
(alles inlinen usw.usw.)
Und genau das soll dieses dazugedachte Keyword dem Compiler ja garantieren...

...tja. Wenn mans ich das so zusammengefasst hinschreibt hört es sich etwas verrückt an :)
 
Kann man nicht, da das Konzept VMT im Standard nicht definiert ist. Der Standard sieht auch nicht vor, dass durch virtuelle Funktionen ein Overhead ensteht, daher ist es auch nicht nötig, dass man das im Standard adressiert. Die Lösung über ein Keyword wie beschrieben find ich nicht in Ordnung. Ein Keyword der Gattung "probier mal, wird schon schief gehen" kann man nicht in einen Standard aufnehmen.
Ein Standard ist compilerspezifischen Lösungen vorzuziehen, findest du nicht? Und wie schon gesagt: Wenn alle es sowieso tun, dann ist es ein Defacto-Standard.

Ich hatte bereits früher erwähnt, dass hier im konkreten Falle von VMTs es nicht die Kindklasse ist die entscheidet, ob selbige nötig ist sondern die Basisklasse(n).
Ja. Doch der Compiler muss die Basisklassen kennen, wenn er eine Kindklasse bekommt. Umgekehrt gilt das nicht. "direct" (ich nenne es jetzt mal so, von mir aus heisst es auch anders) würde ja eben garantieren, dass von einer (Kind-)klasse keine neuen Morphien entstehen, also nicht nochmals vererbt wird. Dann kann der Compiler alle Funktionen auflösen und braucht keine VMT.

Wenn es in der Basisklasse virtuelle Funktionen gibt ist eine VMT immer nötig, sonst kann jemand, der einen Pointer auf die Basisklasse verwendet ja gar nicht wissen, was passiert.
Function Casts können template-isiert werden, wenn das Keyword gesetzt wurde. Ist es einfach? Nein. Aber sind wir uns nicht einig, dass es im jetzigen System zwar generell ideal gelöst ist, im Bezug auf Performance aber nicht?

Wie unterschieden sich die beiden Aufrufe an foo? Woher weiss foo wie es func aufrufen muss wenn es ein mal mit und ein mal ohne VMT arbeitet?
Der Typ ist ja noch gegeben. Das Problem würde erst bei (void*)-Parametern (oder falsch gecasteten) entstehen. Ansonsten wie oben angesprochen: Statt den Pointer direkt zu übernehmen kann der Typ und damit die Funktionsaufrufe in der Funktion angepasst werden.

Nein, kann es nicht. Ein Objekte, dass weder Pointer- noch Referenztyp ist, ist nicht polymorph.
Ja. Ist es nicht das, was ich eigentlich will? Eine Klasse, die zwar wie jede andere Eigenschaften und Funktionen erben kann, was zur Laufzeit aber nicht mehr von einer komplett statischen Klasse zu unterscheiden ist?
Der Typ muss komplett vorhanden sein und zu Kompilierzeit bekannt sein.
Genau das soll das Keyword ja aussagen. "Hey, du weisst jetzt alles. Jetzt kannst du damit machen, was du kannst; es kommt nix mehr hinzu".

((Base)v).func();//Base::Func() <-- Base
Ich wollte eigentlich nur das Pointer-Gedöns sparen :(
Stellt es euch bitte einfach als solches vor (Gecastete pointer statt Kopie).

Bei eine Pointer- oder Referenztypen ist das ganz anders. Der Laufzeittyp ist zu diesem Zeitpunkt nicht bekannt, also muss davon ausgegangen werden, dass es irgendwas sein kann. Alles andere wäre viel zu riskant.
Das soll das Keyword garantieren. Es ist eben nicht mehr riskant, wenn sicher ist, dass nicht weiter (nach aussen) vererbt wird.

Ein Keyword der Gattung "probier mal, wird schon schief gehen" kann man nicht in einen Standard aufnehmen.
Ist es ja nicht. Es ist ein Keyword der Gattung "Ich verspreche, dass du keine VMT brauchst.". Wenn man Versprechen gibt, muss man sie halten - oder mit den Konsequenzen leben. Mir fällt gerade kein richtiges Keyword ein, bei dem das ähnlich ist (new ist ja eher Funktion als Keyword...), aber bei new ist es ähnlich: Wenn ich kein Testing auf Exceptions oder nullptr mache, dann fliegt mir das Ding um die Ohren. Soll ich deswegen auch sagen "new ist schlecht, macht alles nur noch auf dem Stack"?

...tja. Wenn mans ich das so zusammengefasst hinschreibt hört es sich etwas verrückt an :)
Wieso verrückt?
Und genau das soll dieses dazugedachte Keyword dem Compiler ja garantieren...
Ja. Denn der Mensch kann Haltingprobleme lösen. Der Mensch kann wissen, ob er eine Klasse nach aussen geben will oder nicht. Ich weiss, es gibt die "Don't help the Compiler"-Einstellung. Aber gerade hier, wo man potentiell 1/3 der Laufzeit sparen kann, wäre sowas praktisch.

Gruss
cwriter
 
Ein Standard ist compilerspezifischen Lösungen vorzuziehen, findest du nicht? Und wie schon gesagt: Wenn alle es sowieso tun, dann ist es ein Defacto-Standard.

Eben gerade deshalb darf das nicht in den Standard. Erwähnst du im Standard irgendwas von VMT usw erwähnst zwingst du alle VMT zu verwenden, hat jemand eine bessere Idee darf er diese nicht einsetzen, weil er sonst gegen den Standard verstösst. Reduzierst du 'direct' darauf, dass eine Methode nicht weiter überschrieben werden kann musst du das nicht mit einem neuen Keyword machen, dieses Keyword gibts es schon und es nennt sich 'final'.

Ja. Doch der Compiler muss die Basisklassen kennen, wenn er eine Kindklasse bekommt. Umgekehrt gilt das nicht. "direct" (ich nenne es jetzt mal so, von mir aus heisst es auch anders) würde ja eben garantieren, dass von einer (Kind-)klasse keine neuen Morphien entstehen, also nicht nochmals vererbt wird. Dann kann der Compiler alle Funktionen auflösen und braucht keine VMT.

Ob von einer Kindklasse geerbt wird oder nicht ist doch nicht weiter relevant. Fakt ist, dass jemand der die Basisklasse kennt die Kindklasse nicht kennen muss. Das direct Keyword würde dann nur Sinn machen, wenn es auf Base angewandt wird, weil dann der Compiler weiss, dass er nach einem Symbol Base::func suchen muss und einen Aufruf darauf verwenden kann und nicht irgendwelche virtuellen Funktionen aufrufen muss. Das würde aber wiederum bedeuten, dass Base gar keine virtuellen Methoden haben muss, da es ja sowieso nicht vererbt werden kann.

Function Casts können template-isiert werden, wenn das Keyword gesetzt wurde. Ist es einfach? Nein. Aber sind wir uns nicht einig, dass es im jetzigen System zwar generell ideal gelöst ist, im Bezug auf Performance aber nicht?

foo in meinem Beispiel kann nur dann einmal für VMTD und einmal für NoVMTD templateisiert werde, wenn zum Zeitpunkt des Aufrufs der ursprüngliche Code von foo noch bekannt ist. Das ist nur dann der Fall, wenn foo im gleichen Translationunit verarbeitet wird wie der Aufruf an foo. Wenn dem so ist brauchst du das Keyword auch nicht, weil der Compiler/Optimierer dann selber so schlau sein kann das einzubauen, wenn ihm danach ist.

Der Typ ist ja noch gegeben. Das Problem würde erst bei (void*)-Parametern (oder falsch gecasteten) entstehen. Ansonsten wie oben angesprochen: Statt den Pointer direkt zu übernehmen kann der Typ und damit die Funktionsaufrufe in der Funktion angepasst werden.

Gleiches Problem wie oben. Innerhalb der Methode foo ist o.B.d.A nichts mehr über den Typen bekannt. Die entsprechende Ersetzung des Codes abhängig von VMT oder Nicht-VMT müsste also beim Aufruf passieren, dies setzt aber voraus, dass die Funktion in einer Form vorliegt, in der eine solche Übersetzung überhaupt noch möglich ist. Damit sie das ist müsste sie, wie du erwähntest, sozusagen als template markiert werden, damit sie nicht in Objektcode sondern in eine ersetzbare Schablone umgewandelt wird. Dazu brauchen wir aber auch kein neues Keyword, dazu kannst du schlicht template verwenden.

C++:
template<typename T>
void foo(T* ptr) {
   ptr->func();
}

Der Compiler/Optimierer kann nun bei jedem Aufruf entscheiden welche Variante er nehmen möchte und wie er das umsetzen will, da es sich ja nur um ein template handelt.

Ja. Ist es nicht das, was ich eigentlich will? Eine Klasse, die zwar wie jede andere Eigenschaften und Funktionen erben kann, was zur Laufzeit aber nicht mehr von einer komplett statischen Klasse zu unterscheiden ist?

Nein, dann müsstest du deinem keyword noch weitere Eingeschaften hinzufügen. So müsste zum Beispiel Derived von Base immer private erben. Also Derived ist dann kein Base mehr, kann auch nicht mehr in ein Base umgewandelt werden und hat überhaupt keine Relation mehr zu Base, ausser dass es halt die Methoden und Felder einfach übernimmt. Ob das schon ausreicht kann ich dir nicht sagen, du musst jeglichen Fall durchdenken, den es gibt wie man Derived polymorph verwenden könnte und das unterbinden. Das kann man auch nicht dem Compiler überlassen, das muss so im Standard stehen.

Das soll das Keyword garantieren. Es ist eben nicht mehr riskant, wenn sicher ist, dass nicht weiter (nach aussen) vererbt wird.

Wie erwähnt ist das weitervererben nicht der riskante Punkt davon.

Ist es ja nicht. Es ist ein Keyword der Gattung "Ich verspreche, dass du keine VMT brauchst.". Wenn man Versprechen gibt, muss man sie halten - oder mit den Konsequenzen leben. Mir fällt gerade kein richtiges Keyword ein, bei dem das ähnlich ist (new ist ja eher Funktion als Keyword...), aber bei new ist es ähnlich: Wenn ich kein Testing auf Exceptions oder nullptr mache, dann fliegt mir das Ding um die Ohren. Soll ich deswegen auch sagen "new ist schlecht, macht alles nur noch auf dem Stack"?

Du kannst bei der Klasse nicht entscheiden ob eine VMT nötig ist oder nicht, das entscheidet die Verwendung. Den Zusammenhang zu new versteh ich nicht. Es ist im Standard klar definiert, was passiert, wenn eine Exception nicht abfangen wird und ein nullptr ist auch nichts undefiniertes.

Ja. Denn der Mensch kann Haltingprobleme lösen. Der Mensch kann wissen, ob er eine Klasse nach aussen geben will oder nicht. Ich weiss, es gibt die "Don't help the Compiler"-Einstellung. Aber gerade hier, wo man potentiell 1/3 der Laufzeit sparen kann, wäre sowas praktisch.

In der realen Welt hat eine VMT keinen nennenswerten Einfluss auf die Laufzeit. Wo Mikrooptimierungen in diesem Ausmasse nötig sind sollte man gleich auf C umsteigen. Dort herrscht generell ja auch die Akzeptanz, dass dich jede Instruktion aus nicht-reproduzierbaren und nicht-debuggbaren Gründen ins Nirvana kicken kann.
 
Zurück