C Language
inlining
Sök…
Inlinefunktioner som används i mer än en källfil
För små funktioner som ofta kan anropas, kan omkostnaderna associerade med funktionssamtalet vara en betydande bråkdel av den totala utförandetiden för den funktionen. Ett sätt att förbättra prestandan är att eliminera omkostnaderna.
I det här exemplet använder vi fyra funktioner (plus main()
) i tre källfiler. Två av dessa ( plusfive()
och timestwo()
) vardera kallas av de andra två som finns i "source1.c" och "source2.c". Det main()
ingår så att vi har ett fungerande exempel.
main.c:
#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"
int main(void) {
int start = 3;
int intermediate = complicated1(start);
printf("First result is %d\n", intermediate);
intermediate = complicated2(start);
printf("Second result is %d\n", intermediate);
return 0;
}
source1.c:
#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"
int complicated1(int input) {
int tmp = timestwo(input);
tmp = plusfive(tmp);
return tmp;
}
source2.c:
#include <stdio.h>
#include <stdlib.h>
#include "headerfile.h"
int complicated2(int input) {
int tmp = plusfive(input);
tmp = timestwo(tmp);
return tmp;
}
headerfile.h:
#ifndef HEADERFILE_H
#define HEADERFILE_H
int complicated1(int input);
int complicated2(int input);
inline int timestwo(int input) {
return input * 2;
}
inline int plusfive(int input) {
return input + 5;
}
#endif
Funktioner timestwo
och plusfive
kallas av både complicated1
och complicated2
, som finns i olika "översättningsenheter", eller källfiler. För att kunna använda dem på detta sätt måste vi definiera dem i rubriken.
Kompilera så här, förutsatt att gcc:
cc -O2 -std=c99 -c -o main.o main.c
cc -O2 -std=c99 -c -o source1.o source1.c
cc -O2 -std=c99 -c -o source2.o source2.c
cc main.o source1.o source2.o -o main
Vi använder -O2-optimeringsalternativet eftersom vissa kompilatorer inte är inline utan att optimering är aktiverad.
Effekten av det inline
nyckelordet är att den aktuella funktionssymbolen inte släpps ut i objektfilen. Annars skulle ett fel uppstå i den sista raden, där vi länkar objektfilerna för att bilda den slutliga körbara. Om vi inte skulle ha inline
skulle samma symbol definieras i båda .o
filer, och ett "multiplicerad definierad symbol" -fel skulle inträffa.
I situationer där symbolen faktiskt behövs har detta nackdelen att symbolen inte produceras alls. Det finns två möjligheter att hantera det. Den första är att lägga till en extra extern
deklaration av de inlinerade funktionerna i exakt en av .c
filerna. Så lägg till följande till source1.c
:
extern int timestwo(int input);
extern int plusfive(int input);
Den andra möjligheten är att definiera funktionen med static inline
istället för inline
. Denna metod har nackdelen att så småningom en kopia av den aktuella funktionen kan produceras i varje objektfil som produceras med denna rubrik.