C Language
인라인
수색…
둘 이상의 소스 파일에서 사용되는 함수 인라이닝
자주 호출되는 작은 함수의 경우 함수 호출과 관련된 오버 헤드가 해당 함수의 총 실행 시간 중 중요한 부분 일 수 있습니다. 성능을 향상시키는 한 가지 방법은 오버 헤드를 제거하는 것입니다.
이 예제에서 우리는 세 개의 소스 파일에서 네 개의 함수 (더하기 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
파일에 동일한 기호가 정의되고 "다중 정의 기호"오류가 발생합니다.
심볼이 실제로 필요한 상황에서는 심볼이 전혀 생성되지 않는다는 단점이 있습니다. 이를 처리 할 수있는 방법은 두 가지가 있습니다. 첫 번째는 .c
파일 중 하나에 인라인 함수의 여분의 extern
선언을 추가하는 것입니다. 그래서 다음을 source1.c
추가하십시오.
extern int timestwo(int input);
extern int plusfive(int input);
다른 가능성으로는 함수를 정의하는 static inline
대신 inline
. 이 메서드는 결국이 헤더를 사용하여 생성 된 모든 개체 파일에서 해당 함수의 복사본을 생성 할 수 있다는 단점이 있습니다.