Zoeken…


Inlining-functies die in meer dan één bronbestand worden gebruikt

Voor kleine functies die vaak worden aangeroepen, kan de overhead geassocieerd met de functieaanroep een aanzienlijk deel zijn van de totale uitvoeringstijd van die functie. Een manier om de prestaties te verbeteren, is dan om de overhead te elimineren.

In dit voorbeeld gebruiken we vier functies (plus main() ) in drie bronbestanden. Twee daarvan ( plusfive() en timestwo() ) worden elk aangeroepen door de andere twee in "source1.c" en "source2.c". De main() is opgenomen, dus we hebben een werkend voorbeeld.

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

Functies timestwo en plusfive worden zowel complicated1 als complicated2 , die zich in verschillende "vertaaleenheden" of bronbestanden bevinden. Om ze op deze manier te gebruiken, moeten we ze in de kop definiëren.

Compileer zo, uitgaande van 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

We gebruiken de optie -O2-optimalisatie omdat sommige compilers niet inline gaan zonder dat optimalisatie is ingeschakeld.

Het effect van het inline sleutelwoord is dat het betreffende functiesymbool niet in het objectbestand wordt uitgezonden. Anders zou er een fout optreden in de laatste regel, waarbij we de objectbestanden koppelen om het uiteindelijke uitvoerbare bestand te vormen. Als we geen inline zouden hebben, zou hetzelfde symbool in beide .o bestanden worden gedefinieerd en zou een foutmelding 'vermenigvuldigd symbool' optreden.

In situaties waar het symbool daadwerkelijk nodig is, heeft dit het nadeel dat het symbool helemaal niet wordt geproduceerd. Er zijn twee mogelijkheden om daarmee om te gaan. De eerste is om een extra extern aangifte van de geïntegreerde functies toe te voegen in precies een van de .c bestanden. Voeg dus het volgende toe aan source1.c :

extern int timestwo(int input);
extern int plusfive(int input);

De andere mogelijkheid is om de functie te definiëren met static inline plaats van inline . Deze methode heeft het nadeel dat uiteindelijk een kopie van de betreffende functie kan worden geproduceerd in elk objectbestand dat met deze header wordt geproduceerd.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow