Erzwingen Funktionszeiger das Löschen einer Anweisungspipeline?

Moderne CPUs verfügen über ein umfangreiches Pipelining, dh sie laden die erforderlichen Anweisungen und Daten, lange bevor sie die Anweisung tatsächlich ausführen.

Manchmal werden die in die Pipeline geladenen Daten ungültig, und die Pipeline muss gelöscht und mit neuen Daten neu geladen werden. Die zum Nachfüllen der Pipeline erforderliche Zeit kann beträchtlich sein und zu einer Leistungsverlangsamung führen.

Wenn ich in C einen Funktionszeiger aufrufe, ist die Pipeline intelligent genug, um zu erkennen, dass der Zeiger in der Pipeline ein Funktionszeiger ist und dass er diesem Zeiger für die nächsten Anweisungen folgen sollte? Oder führt ein Funktionszeiger dazu, dass die Pipeline gelöscht und die Leistung verringert wird?

Ich arbeite in C, aber ich stelle mir vor, dass dies in C ++ noch wichtiger ist, wo viele Funktionsaufrufe über V-Tabellen erfolgen.

bearbeiten

@JensGustedt schreibt:

Um ein echter Leistungstreffer für Funktionsaufrufe zu sein, muss die aufgerufene Funktion extrem kurz sein. Wenn Sie dies beobachten, indem Sie Ihren Code messen, sollten Sie Ihr Design definitiv überarbeiten, damit dieser Aufruf eingebunden werden kann

Leider könnte das die Falle sein, in die ich geraten bin.

Ich habe die Zielfunktion aus Performancegründen klein und schnell geschrieben.

Es wird jedoch von einem Funktionszeiger referenziert, so dass es leicht durch andere Funktionen ersetzt werden kann (Stellen Sie den Zeiger auf eine andere Funktion!). Da ich über einen Funktionszeiger darauf verweise, glaube ich nicht, dass es inliniert werden kann.

Ich habe also eine extrem kurze, nicht inline Funktion.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage