C Language
Inlining
Suche…
Inlining-Funktionen, die in mehreren Quelldateien verwendet werden
Bei kleinen Funktionen, die häufig aufgerufen werden, kann der mit dem Funktionsaufruf verbundene Aufwand einen erheblichen Bruchteil der gesamten Ausführungszeit dieser Funktion ausmachen. Eine Möglichkeit, die Leistung zu verbessern, besteht darin, den Overhead zu beseitigen.
In diesem Beispiel verwenden wir vier Funktionen (plus main()
) in drei Quelldateien. Zwei davon ( plusfive()
und timestwo()
) werden jeweils von den anderen beiden in "source1.c" und "source2.c" aufgerufen. Das main()
ist enthalten, so dass wir ein Arbeitsbeispiel haben.
Haupt 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;
}
Headerdatei.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
Die Funktionen timestwo
und plusfive
werden von sowohl complicated1
als auch complicated2
aufgerufen, die sich in unterschiedlichen "Übersetzungseinheiten" oder Quelldateien befinden. Um sie auf diese Weise verwenden zu können, müssen wir sie im Header definieren.
Kompilieren Sie wie folgt, vorausgesetzt, 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
Wir verwenden die -O2-Optimierungsoption, da einige Compiler nicht ohne eingeschaltete Optimierung inline sind.
Das inline
Schlüsselwort bewirkt, dass das betreffende Funktionssymbol nicht in die Objektdatei ausgegeben wird. Andernfalls würde in der letzten Zeile ein Fehler auftreten, in dem die Objektdateien zur endgültigen ausführbaren Datei verknüpft werden. Wenn wir keine inline
, würde dasselbe Symbol in beiden .o
Dateien definiert, und es würde ein Fehler "mehrfach definiertes Symbol" auftreten.
In Situationen, in denen das Symbol tatsächlich benötigt wird, hat dies den Nachteil, dass das Symbol überhaupt nicht erzeugt wird. Hierfür gibt es zwei Möglichkeiten. Die erste ist das Hinzufügen einer zusätzlichen extern
Deklaration der eingebetteten Funktionen in genau einer der .c
Dateien. source1.c
zu source1.c
folgendes source1.c
:
extern int timestwo(int input);
extern int plusfive(int input);
Die andere Möglichkeit besteht darin, die Funktion mit static inline
statt mit inline
zu definieren. Diese Methode hat den Nachteil, dass in jeder Objektdatei, die mit diesem Header erstellt wird, möglicherweise eine Kopie der fraglichen Funktion erstellt wird.