Поиск…


Функции вложения, используемые в более чем одном исходном файле

Для небольших функций, вызываемых часто, служебные данные, связанные с вызовом функции, могут быть значительной частью общего времени выполнения этой функции. Таким образом, одним из способов повышения производительности является устранение накладных расходов.

В этом примере мы используем четыре функции (плюс main() ) в трех исходных файлах. Два из них ( plusfive() и timestwo() ) каждый вызываются двумя другими, расположенными в «source1.c» и «source2.c». main() включен, поэтому у нас есть рабочий пример.

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

Функции timestwo и plusfive вызываются как complicated1 и complicated2 , которые находятся в разных «единицах перевода» или исходных файлах. Чтобы использовать их таким образом, мы должны определить их в заголовке.

Скомпилируйте это, предположив 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

Мы используем опцию оптимизации -O2, потому что некоторые компиляторы не встроены без оптимизации.

Эффект ключевого слова inline заключается в том, что соответствующий символ функции не попадает в объектный файл. В противном случае в последней строке будет возникать ошибка, когда мы связываем объектные файлы с окончательным исполняемым файлом. Если бы у нас не было inline , один и тот же символ был бы определен в обоих файлах .o , и возникла бы ошибка «с несколькими символами».

В ситуациях, когда символ действительно необходим, это имеет тот недостаток, что символ вообще не создается. Есть две возможности справиться с этим. Первое заключается в добавлении дополнительного выражения extern для встроенных функций в один из файлов .c . Поэтому добавьте следующее в source1.c :

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

Другая возможность - определить функцию со static inline а не inline . Этот метод имеет недостаток, что в конечном итоге копия рассматриваемой функции может быть создана в каждом объектном файле, который создается с этим заголовком.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow