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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow