Ich las ein Beispiel über Polymorphismus, die wie unten aussieht, wo show() eine virtuelle Funktion ist:Warum nicht früh binden, wenn möglich?
int main()
{
Derived dv1;
Derived dv2;
Base* ptr;
ptr = &dv1;
ptr->show();
ptr = &dv2;
ptr->show();
}
Die Bücher sagen, dass in diesem Fall der Compiler late binding
Technik verwendet wird. Ich verstehe den Unterschied zwischen der späten Bindung und der frühen Bindung. In diesem Beispiel können wir (und vielleicht auch der Compiler) sehen, welche Funktion aufgerufen werden sollte, da die Objekte, auf die ptr
zeigt, nicht geändert werden. Also, warum nicht früh in diesem Fall binden, weil späte Bindung etwas Overhead verursachen wird?
Woher wissen Sie, dass Ihr Compiler diesen Fall nicht wirklich erkennt und einige Optimierungen dafür durchführt? Haben Sie den generierten Assemblercode überprüft? Mit aktivierten Optimierungen? –
Ich bin nicht mit Assembler-Code vertraut. Die Tatsache, dass die Bücher sagen, dass die späte Bindung in diesem Fall angewendet wird, verwirrt mich. – Rickie
Clang scheint zumindest [a * bit * more] (https://godbolt.org/g/9pnkg9) zu tun, als nur die Aufrufe zu optimieren, um abgeleitet zu werden, zumindest für einfache Implementierungen von 'show'. – jaggedSpire