2013-02-07 6 views
15

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

+2

Siehe Herb Sutters [Inline Redux] (http://www.drdobbs.com/inline-redux/184403879). –

Antwort

12

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.

+0

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? –

+6

@NicholasWilson das wäre ein schlechtes Programm. –

+2

@NicholasWilson das wäre eine Verletzung der Ein-Definition-Regel, und es wird explizit aufgerufen als kein definiertes Verhalten. –

4

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.

3

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.

2

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.

Verwandte Themen