C Language
Inlining
Recherche…
Fonctions d'inline utilisées dans plus d'un fichier source
Pour les petites fonctions appelées souvent, la surcharge associée à l'appel de la fonction peut représenter une fraction significative du temps d'exécution total de cette fonction. Une façon d'améliorer les performances consiste donc à éliminer les frais généraux.
Dans cet exemple, nous utilisons quatre fonctions (plus main()
) dans trois fichiers sources. Deux d'entre elles ( plusfive()
et timestwo()
) sont appelées par les deux autres situées dans "source1.c" et "source2.c". Le main()
est inclus, nous avons donc un exemple de travail.
principal 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
Fonctions timestwo
et plusfive
s'appellent à la fois par complicated1
et complicated2
, qui sont dans des « unités de traduction », ou les fichiers source. Pour les utiliser de cette manière, il faut les définir dans l’en-tête.
Compilez comme ceci, en supposant que 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
Nous utilisons l'option d'optimisation -O2 car certains compilateurs ne sont pas intégrés sans optimisation activée.
L'effet du mot clé en inline
est que le symbole de la fonction en question n'est pas émis dans le fichier objet. Sinon, une erreur se produirait dans la dernière ligne, où nous lions les fichiers objet pour former le dernier exécutable. Si nous n'avions pas de inline
, le même symbole serait défini dans les deux fichiers .o
et une erreur "symbole défini par plusieurs" se produirait.
Dans les situations où le symbole est réellement nécessaire, cela présente l'inconvénient que le symbole n'est pas produit du tout. Il y a deux possibilités pour faire face à cela. La première consiste à ajouter une déclaration extern
supplémentaire des fonctions intégrées dans l’un des fichiers .c
. Donc, ajoutez ce qui suit à source1.c
:
extern int timestwo(int input);
extern int plusfive(int input);
L'autre possibilité est de définir la fonction avec static inline
au lieu de inline
. Cette méthode a l'inconvénient qu'une copie de la fonction en question peut éventuellement être produite dans chaque fichier objet produit avec cet en-tête.