2012-04-26 10 views
6
void run_hot(void) { 
    // I am called very often! 
    serve(); 
    // <more code here> 
} 

void run_cold(void) { 
    // I am called only occasionally! 
    serve(); 
    // <more code here> 
} 

???inline??? void serve(void) { 
    // I only want to be called inline from hot functions! 
    // <more code here> 
} 

Gibt es eine Möglichkeit, um explizit eine Funktion A in einer Funktion B inline während explizit nicht die gleiche Funktion A in einer Funktion C inlining? Oder bin ich meinem Compiler völlig ausgeliefert?Kann ich eine Funktion teilweise/selektiv inline einbinden?

+0

Sie können das Inlining verhindern, indem Sie eine Funktion in eine separate Kompilierungseinheit einfügen. –

+0

@JensGustedt Kannst du ein Beispiel geben? Ich habe Schwierigkeiten, zu erraten, was für ein Schema Sie vorhaben. – Will

+0

Wenn Sie nicht möchten, dass eine Funktion inline ist, legen Sie die Definition in eine separate .c-Datei und kompilieren Sie sie separat. –

Antwort

4

Sie sind dem Compiler mit Inlining völlig ausgeliefert.
Lassen Sie teilweise beiseite, ob oder nicht inline eine Funktion ist nur eine Entscheidung, die am besten vom Compiler gemacht wird und Sie sollten sich darauf verlassen, um die beste Entscheidung zu treffen.

+0

> ob eine Funktion inline ist, ist nur eine Entscheidung, die am besten vom Compiler gemacht wird In der Tat, das scheint konventionelle Weisheit, und normalerweise die klügste Sache zu tun, aber ich frage mich über einige Fälle, in denen Beurteilen Sie, welche Funktionen "heiß" sind, der Compiler muss wissen, welche Art von Daten das Programm verarbeiten wird - wobei es natürlich nicht weiß, ob die Daten von einem externen IO ankommen. So scheint es mir, gibt es Fälle, in denen der menschliche Programmierer _does_ besser wissen ... – Will

+3

@Will Wenn Sie GCC verwenden, können Sie '__attribut __ ((hot))' verwenden, um dem Compiler zu sagen, diese Funktion mehr zu optimieren es müsste nicht raten. – ughoavgfhw

+0

@hughoavgfhw Ausgezeichnet! Vielen Dank! – Will