Inlinen von Aufrufen virtueller Funktionen
-
Hallo,
mich würde interessiere, ob Compiler *prinzipiell* fähig sind zu erkennen, dass der Umweg über die VTable überflüssig ist und in einem solchen Fall den Aufruf einer virtuellen Funktion nicht-virtuell gestaltet (und evtl. sogar inlined).
Folgende Situation:
struct Base { virtual std::string f() { return "Base"; } }; struct Derived : public Base { std::string f() { return "Derived"; } }; int main(int argc, char* argv[]) { using namespace std; Base* b = new Base(); Base* d = new Derived(); cout << b->f() << endl; // * cout << d->f() << endl; }Durch eine Flusskontroll-Analyse könnte der Compiler doch feststellen, dass dieses 'b' tatsächlich eine 'Base' zugewiesen bekommt und dass der mit '*' gekennzeichnete Aufruf direkt erfolgen kann und die VTable nicht konsultiert werden muss. Oder?
(Ich weiß, dass einige virtuelle Maschinen (.NET ...) Heuristiken anwenden, um virtuelle Methodenaufrufe zur Laufzeit zu optimieren. Das ist aber nicht dieselbe Situation.)
-
bei zeigern und referenzen ist das nicht möglich
bei normalen instanzen jedoch schonimho gehört die frage ins compiler-forum und nicht nach c++
-
Konrad Rudolph schrieb:
Durch eine Flusskontroll-Analyse könnte der Compiler doch feststellen, dass dieses 'b' tatsächlich eine 'Base' zugewiesen bekommt und dass der mit '*' gekennzeichnete Aufruf direkt erfolgen kann und die VTable nicht konsultiert werden muss. Oder?
Dass es prinzipiell möglich ist, hast du dir ja damit schon selbst bewiesen

-
Bashar schrieb:
Dass es prinzipiell möglich ist, hast du dir ja damit schon selbst bewiesen

Gut, aber es gibt ja eventuell Hinderungsgründe, z.B. könnte diese Flusskontrolle algorithmisch komplex sein. r0nnys Aussage entnehme ich, dass das nicht gemacht wird und dafür wird es ja sicherlich einen Grund geben. Vielleicht ist die Frage in C++ sowieso falsch gestellt; hier hat man ja die Möglichkeit, auf nicht-virtuelle Funktionen auszuweichen. In anderen Sprachen (Java ...) ist das nicht möglich.
r0nny schrieb:
imho gehört die frage ins compiler-forum und nicht nach c++
ACK. Tut mir leid.
-
es ist nicht komplett unmöglich, nur aufgrund der pointer/referenzsemanik in bezug auf abgeleitete klassen sehr schwirig zu implementieren
da es außerdem nur sehr begrenzt einsetzbar ist, (funktions-lokal) macht es keinen sinn sowas einzuführen