수색…


둘 이상의 소스 파일에서 사용되는 함수 인라이닝

자주 호출되는 작은 함수의 경우 함수 호출과 관련된 오버 헤드가 해당 함수의 총 실행 시간 중 중요한 부분 일 수 있습니다. 성능을 향상시키는 한 가지 방법은 오버 헤드를 제거하는 것입니다.

이 예제에서 우리는 세 개의 소스 파일에서 네 개의 함수 (더하기 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

기능 timestwoplusfive 모두 전화를받을 complicated1complicated2 다른 "번역 단위", 또는 소스 파일에 있습니다. 이러한 방식으로 사용하려면 머리글에 정의해야합니다.

다음과 같이 컴파일하면 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 . 이 메서드는 결국이 헤더를 사용하여 생성 된 모든 개체 파일에서 해당 함수의 복사본을 생성 할 수 있다는 단점이 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow