PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Funktions-Inlining


Coda
2007-05-05, 11:21:48
Ist es bei gängigen Compilern eigentlich relevant in welcher Reihenfolge die Funktionen in der Übersetzungseinheit stehen wenn es darum geht ob der Compiler sie automatisch inline verwendet?

D.h. muss die Funktion über der stehen in der sie verwendet wird oder ist das egal?

Gast
2007-05-07, 16:19:56
Ganz schwierige Frage. Es sollte eigentlich egal sein.

Mit inlining ist es aber so, dass es nur ein Hinweis für den Compiler ist. Es ist nicht Pflicht, daraus wirklich Inline Code zu machen.

Den Microsoft Compilern ist es egal, in welcher Reihenfolge die inlines stehen.

Bei GNU Compilern ist die Reihenfolge soweit ich weiss nicht egal. Du bekommst eine Warnung, wenn eine inline Methode versucht, eine andere inline Methode aufzurufen, die erst später definiert wird.

Coda
2007-05-07, 16:31:16
Ich meinte ja automatisches Inlining, also sogar ohne "inline" Keyword.

Gast
2007-05-07, 16:47:53
Noch schwieriger zu beantworten.

Ich weiss, dass Microsoft Compiler alles inline macht was sinnvoll ist, wenn man volle Optimierung eingeschaltet hat.

Bei GNU bin ich mir nicht sicher. Was ich mir aber so an assembler listings vom GNU angesehen habe, macht er auch alles inline soweit es geht, bei voller Optimierung. Ob hier die Reihenfolge der Funktionsdefinition egal ist, weiss ich aber nicht genau. Bei Microsoft bin ich mir aber wie gesagt sicher, dass dem Compiler dieser Umstand egal ist.

Alles in allem darf man sich aber sowieso nicht darauf verlassen, was zu inline Code wird und was nicht. Stark entscheident ist auch die Größe einer Funktion. Bei GNU gibt es da auf jeden Fall Beschränkungen. Man kann sich hierzu auch Warnungen ausgeben lassen. Bei Microsoft ist mir die Maximalgröße einer Funktion nicht bekannt, die inline gemacht werden kann.

Im Zweifelsfall sollte man sich immer ein Assembler-Listing ausgeben lassen.

Gast
2007-05-07, 18:11:31
Ich meinte ja automatisches Inlining, also sogar ohne "inline" Keyword.
Das dürfte dann egal sein. Inlining ist ein extra pass bei dem die zu inlinende Funktion von den "Kosten" her bekannt sein muss, zu dem Zeitpunkt sind also alle Funktionen bekannt und dann kann der Compiler unabhängig vom vorherigen Code auch inlinen.
Die Reihenfolge ist bei Sprüngen jedoch relevant. Funktionend ie vorher definiert wurden stehen auch vorher im Binary. falls zwei funktionen also z.B. rekursiv aufeinander zugreifen, empfiehlt es sich sie nah im Code beieinander zu schreiben.