Sagen wir, ich habe eine Funktion in meinem Programm und irgendwo in meinem Code, diese Funktion wird durch einen Funktionszeiger aufgerufen. Was passiert, wenn der Compiler diese Funktion inline einbaut, oder würde der Compiler erkennen, dass dieser Funktion ein Funktionszeiger zugewiesen ist und daher vermieden wird, ihn zu inlinern.Was passiert, wenn der Compiler eine Funktion inline eingibt, die durch einen Funktionszeiger aufgerufen wird
Antwort
Wenn ein Zeiger auf eine Funktion genommen wird, wird der Compiler eine nichtlineare Stelle für die Funktion generieren. Es ist immer noch möglich, die Funktion an anderen Call-Sites einzubinden.
Beachten Sie, dass eine Funktion mit der Bezeichnung inline
eine Definition in allen TUs haben muss, die sich darauf beziehen, und diese Definitionen müssen identisch sein. Das bedeutet, dass es vollkommen sicher ist, die Funktion bei einigen Call-Sites einzubinden und sie bei anderen außerhalb der Leitung zu halten.
Was passiert, wenn die Definitionen nicht identisch sind (zB einige ifdef Code) und der Linker mehrere Versionen der Funktion bekommt? Das "Inline" wird vom Linker vermutlich als schwaches Symbol angesehen, und Sie erhalten nur das erste, das auftaucht? –
@NicholasWilson das wäre ein schlechtes Programm. –
@NicholasWilson das wäre eine Verletzung der Ein-Definition-Regel, und es wird explizit aufgerufen als kein definiertes Verhalten. –
Nun, es wird sicherlich funktionieren. Ich sehe nicht, wie Inlining das verhindern würde. Sie haben nur etwas Code, der die Funktion direkt aufruft, und sie könnte dort inline sein, und Sie haben etwas Code, der es durch einen Funktionszeiger aufruft, genau wie eine reguläre Funktion.
Es gibt keinen Grund, dass die Verwendung eines Funktionszeigers Inlining verhindern sollte. Inlining wird von Fall zu Fall durchgeführt und kann neben einem üblichen Funktionskörper existieren. So kann eine Funktion an einer Stelle inline und in einer anderen aufgerufen werden.
Der Compiler wird daher inline, wo es eine aufrufbare Funktion für Ihren Funktionszeiger erzeugen kann und immer noch produzieren.
Nicht nur, dass die Compiler inline „andere Aufrufe der Funktion“, aber es kann auch Inline-Anrufe über Funktionszeiger, wenn es über die Funktion genug versteht, tatsächlich verwendet wird, etwa wie folgt:
typedef void (*funcptr)();
void somefunc()
{
... do stuff here ...
}
void indirection(funcptr *f)
{
f();
}
void call_with_ptr()
{
funcptr f = somefunc();
for(int i = 0; i < 100; i++)
{
indirection(f);
}
}
Ich hatte Code ähnlich zu diesem, und es inline die Umleitung, und machte den Aufruf von somefunc() einen direkten Aufruf ohne Verwendung des Funktionszeigers.
Das setzt natürlich voraus, dass der Compiler herausfinden kann, welche Funktion aus dem Code aufgerufen wird - was in diesem Fall offensichtlich ist, aber wenn es Laufzeitentscheidungen gibt, kann dies nicht der Fall sein.
- 1. Was passiert, wenn die() innerhalb einer Funktion aufgerufen wird
- 2. Was passiert, wenn eine neue Instanz eines Objekts aufgerufen wird?
- 3. Was passiert, wenn eine Inline-Funktion als Parameter in C übergeben wird?
- 4. Inline-Funktionszeiger zu vermeiden, wenn Anweisung
- 5. Wird GCC inline eine Funktion, die einen Zeiger nimmt?
- 6. Was passiert, wenn Rekursion in einer Methode zweimal aufgerufen wird?
- 7. Was passiert, wenn 'return' innerhalb eines 'using' Blocks aufgerufen wird?
- 8. Was passiert, wenn eine App übersendet wird?
- 9. Was passiert, wenn kfree Funktion
- 10. Compiler Behandlung von struct Funktionszeiger
- 11. Wie wird die Funktion aufgerufen, mit der setTimeout aufgerufen wird?
- 12. Optimieren und Inline-Aufrufe über Funktionszeiger
- 13. Was passiert, wenn Object.ToString aufgerufen wird, wenn der tatsächliche Typ String
- 14. Gibt es eine vordefinierte Funktion in iOS, die aktiviert wird, wenn der Benutzer ein Symbol eingibt?
- 15. Funktion, die einen Funktionszeiger Syntax gibt
- 16. Was passiert, wenn eine Scala "Future" Müll gesammelt wird?
- 17. Welche Funktion wird aufgerufen, wenn die iPhone App beendet wird?
- 18. Unit-Tests: Was passiert, wenn die Methode/Funktion Test nicht
- 19. Was passiert, wenn ich eine Datei lösche, die durch Eingabeumleitung verwendet wird?
- 20. Was passiert, wenn auf eine bereits abgeschlossene Aufgabe gewartet wird?
- 21. Was passiert, wenn veröffentlicht
- 22. Was passiert, wenn wir eine Webseite aktualisieren?
- 23. Compiler Hinweis: "Inline-Funktion '...' erweitert nicht ..."
- 24. Welche Funktion wird aufgerufen?
- 25. Wie zur Kompilierzeit zu überprüfen, wenn eine Funktion aufgerufen wird
- 26. Was passiert genau in AngularJS, wenn die Seite aktualisiert wird?
- 27. Was passiert, wenn ich eine Ausnahme erstelle?
- 28. Warum muss eine Inline-Funktion in einem Header "definiert" werden, wenn der Compiler nur Inline-Funktionen ausführen kann
- 29. Was passiert bevor die _start Funktion in /lib/ld-linux.so.2 aufgerufen wird?
- 30. Funktionsüberlastung durch Funktionszeiger
Siehe Herb Sutters [Inline Redux] (http://www.drdobbs.com/inline-redux/184403879). –