Hallo zusammen,
angenommen, ich habe eine Funktion, die zur Laufzeit nur statisch
geinlined genutzt werden soll, da sie nur einmal im Projekt vorkommt und
extrem häufig aufgerufen wird. Für die Modul-Tests sollte sie jedoch
dennoch auch als normal "aufrufbare" Funktion vorhanden sein. Wie sähe
da eine sinnvolle Namenskonvention aus?
Mein erster Gedanke:
Mach sie weder inline noch static und aktiviere LTO, dann wird sie
geinlined wenn nur 1x aufgerufen.
Walter T. schrieb:> Für die Modul-Tests sollte sie jedoch dennoch auch als> normal "aufrufbare" Funktion vorhanden sein.
Wozu genau?
Niklas G. schrieb:> [...] dann wird sie> geinlined wenn nur 1x aufgerufen.
Sie wird nicht 1x aufgerufen. Sie wird 15x aufgerufen. Bei einem dieser
15 Aufrufe, dem Wichtigsten, soll sie aber definitiv geinlined werden,
weil dieser in einer häufig aufgerufenen ISR stattfindet. Da es sich
aber (bis auf das Inlining) um die gleiche Funktion handelt, sollte der
Name zusammenpassen.
Walter T. schrieb:> angenommen, ich habe eine Funktion, die zur Laufzeit nur statisch> geinlined genutzt werden soll, da sie nur einmal im Projekt vorkommt
Diese Begründung ist Unsinn. Jede (normale) Funktion darf nur einmal
in einem Projekt vorkommen. Funktionen mit dem Attribut static dürfen
einmal pro Übersetzungseinheit vorkommen.
> und extrem häufig aufgerufen wird.
Das spricht eigentlich gegen das Inlinen.
> Für die Modul-Tests sollte sie jedoch> dennoch auch als normal "aufrufbare" Funktion vorhanden sein. Wie sähe> da eine sinnvolle Namenskonvention aus?
Lesen: https://gcc.gnu.org/onlinedocs/gcc/Inline.html
Falls dein Compiler nicht gcc ist, dann lies das Handbuch dieses
Compilers.
Walter T. schrieb:> Sie wird nicht 1x aufgerufen. Sie wird 15x aufgerufen. Bei einem dieser> 15 Aufrufe, dem Wichtigsten, soll sie aber definitiv geinlined werden
Das geht nicht. Das Schlüsselwort inline ist nur ein Hinweis an den
Compiler, daß er diese Funktion inlinen darf bzw. sollte. Der Compiler
darf aber eine solcherart gekennzeichnete Funktion auch nicht inlinen
oder andererseits eine nicht so gekennzeichnete Funktion doch inlinen.
So lange, wie dabei das (vom Standard garantierte) Verhalten des
Programms gleich bleibt.
Es gibt compilerspezifische Möglichkeiten, das Inlinen von Funktionen zu
erzwingen, z.B. __attribute__((always_inline)) für gcc. Das bezieht sich
dann aber auf jegliche Verwendung der Funktion.
Dann sind es halt zwei Funktionen, die komplett identisch sind, bis
auf dass die eine das Attribut static inline
__attribute__((always_inline)) hat. Oben wurde doch schon das Beispiel
gezeigt. Die Frage ist doch lediglich, wie ein sinnvolles Namensschema
aussieht.
Ich weiß nicht, ob die obenstehende Fragestellung so unverständlich ist,
oder ob sie mit Absicht falsch verstanden wird.
Walter T. schrieb:> Ich weiß nicht, ob die obenstehende Fragestellung so unverständlich ist,> oder ob sie mit Absicht falsch verstanden wird.
Oder, deine Anforderung ist laut C Standard unerfüllbar.
Denn ein Funktionsbezeichner muss in einer Übersetzungseinheit eindeutig
sein.
Und wenn dir dein Unterstrich reicht... dann ist es doch gut.
Teilst du auf 2 Übersetzungseinheiten auf, dann dürfte das machbar sein.
Dann kannst du jeder Einheit eine eigene Funktion verpassen.
Auch mit gleichem Bezeichner.
Walter T. schrieb:> Für die Modul-Tests sollte sie jedoch> dennoch auch als normal "aufrufbare" Funktion vorhanden sein.
Warum? Sollen die Modultests die doch auch inlinen, an der
Funktionalität ändert das nichts. Du weißt ja nichtmal, ob der Compiler
das nicht sowieso macht.
Oliver
Oliver S. schrieb:> Warum? Sollen die Modultests die doch auch inlinen, an der> Funktionalität ändert das nichts. Du weißt ja nichtmal, ob der Compiler> das nicht sowieso macht.
Die Modultests liegen sicher nicht im gleichen Modul. Deshalb möchte er
einen Wrapper, der global sichtbar ist, um die static (geinlinete)
Funktion testen zu können.
900ss D. schrieb:> möchte er> einen Wrapper, der global sichtbar ist, um die static (geinlinete)> Funktion testen zu können.
Ja, das klingt genau nach dem, was ich meine.
Gibt es irgendwelche üblichen Namenskonventionen für wrapper-Funktionen
oder gewrappte Funktionen?
Ich würde hier wahrscheinlich mit einem define für das static inline
arbeiten und beim Modultest mit einem leeren define ersetzen.
So testet man direkt die Funktion und nicht den Wrapper.