Funktion static inline und nicht static inline

#5801689
Lesenswert?

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:
1
static inline uint8_t foo_(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
2
{
3
    return (a^b)<<(c^(d&0x13));
4
}
5

6

7
uint8_t foo(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
8
{
9
    return foo_(a, b, c, d);
10
}

Aber ich gehe davon aus, daß der Berufs-C-Programmierer bei einem 
Unterstrich eher andere Assoziationen hat.
#5801713
Lesenswert?

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.
#5801833
Lesenswert?

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.
#5801848
Lesenswert?

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.
Gast #5801853
Lesenswert?

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.
#5801868
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren