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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow