2008-11-11 4 views
6

인라인 함수를 사용하면 메모리 사용량이 증가합니까?C 인라인 함수 및 메모리 사용

+0

일반적으로 이것은 응답 할 수 없습니다. 특정 예제가 있으면 시도해보고 어떤 일이 발생하는지 확인하십시오. –

답변

2

기능에 따라 다릅니다. 호출 스택을 설정 및 정리하고 함수 호출을 수행 할 필요가 없으므로 단순한 단일 라이너에서 메모리를 줄일 수 있습니다. 함수가 함수를 호출하는 데 필요한이 오버 헤드보다 큰 경우 코드가 부 풀리게됩니다.

1

인라인 함수는 호출 할 때마다 "복사 붙여 넣기"되므로 최종 실행 파일 (또는 바이너리)의 크기를 확실히 늘립니다.

+0

죄송 합니다만 귀하의 답변은 불완전하며 위의 답변에 포함되어 있습니다. –

0

당신은 프로그램이 일반적으로 더 커질 것입니다 (나는 예외가 있다고 확신합니다). 런타임 메모리 소비는 줄어들지 만 많지는 않습니다.

왜 묻는거야? 일반적으로 컴파일러에서 함수가 인라인되어야하는지 여부를 결정하게합니다. 함수의 크기와 복잡성을 감안할 때 대개 더 나은 호출을 할 수 있습니다.

6

당신이 고려해야 할 또 다른 점있다 :

인라인 함수를 사용하여이 컴파일러는 호출자의 변수는 호출자의 변수로 사용하려고하는 위치를 확인할 수 있습니다. 컴파일러는 최적화 할 수 있습니다 (종종 이것은 생략 될 수있는 많은 어셈블러 라인입니다. 소위 "앨리어싱 문제"를 찾으십시오). 그래서 당신의 "코드 팽창"은 종종 그다지 크지 않습니다. 특히 작은 기능을 가진다면 짐이 위에서 말한 것처럼 부 풀릴 수도 있습니다.

누군가 좋은 점을 보였습니다. 컴파일러가 문제의 기능을 인라인하는지 아닌지를 결정하게합니다.

0

함수 호출에는 여러 가지 프로세서 지침이 필요합니다.

일반적으로 함수에 대한 모든 인수, 함수를 호출하는 CALL 명령어 및 함수 호출 후 스택을 정리하는 다른 명령어에 대해 PUSH 명령어가 필요합니다.

또한 함수는 프로세서의 레지스터를 수정할 수 있으므로 레지스터를 유지하거나 레지스터에 남아있는 값을 다시로드하는 데 더 많은 명령이 필요할 수 있습니다.

호출하려는 함수가 길지 않은 명령어 인 경우, 인라인을 사용하면 을 빠르게 실행할 수 있습니다.

즉, 인라인은 프로파일 러에서 사용자에게 알려야 할 때입니다.

+0

C는 모든 매개 변수가 스택에 푸시되는 ABI를 정의합니다. C++은 특정 ABI를 정의하지 않으므로 컴파일러 구현시 매개 변수 전달을 위해 레지스터를 사용할 수 있습니다. 따라서 대부분의 상황에서 모든 매개 변수가 스택으로 푸시되지는 않습니다. –

2

일반적인 경우에는 실제로 대답 할 수 없습니다.

일반적으로 인라인을 제어 할 수는 없습니다. 함수를 인라인으로 표시한다고 할지라도, 컴파일러가 실제로 인라인 (실제로는 힌트 일뿐입니다)을 수행 할 것입니다.

컴파일러는 코드를 최적화하기 위해 최선을 다할 것입니다. 인라인을 사용하는 것은 이것을 수행하는 한 가지 도구 일뿐입니다. 따라서 짧은 함수를 인라이닝하면 코드를 더 작게 만들 수 있습니다 (호출에 대한 매개 변수를 설정하거나 반환 값을 검색 할 필요가 없기 때문에)하지만 긴 함수를 사용하더라도 절대적인 것은 아닙니다.

컴파일러가 긴 함수를 인라인하면 코드가 길어질 것이라고 생각할 것입니다.그러나 일반적으로 그런 경우는 아닙니다. 이는 컴파일러에게 잠재적으로 코드를 더 작게 만들 수있는 다른 최적화 기법을 적용 할 수있는 기회를 제공하기 때문입니다. 컴파일러 분석 결과 코드가 부풀어 올라 코드에 해를 끼치는 것으로 판명되면 인라인이 수행되지 않습니다.

기본적으로 컴파일러는 분석을 수행하고 최선의 조치 과정을 결정합니다.

결론. 그것에 대해 걱정하지 마십시오. 컴파일러는 당신보다 더 똑똑하고 올바른 일을 할 것입니다.

0

때때로 우리는 프로그램 전체에 함수가 흩어져있는 경우가 있습니다.이 경우 함수 호출은 프로그램이 함수 주소로 점프하고 함수 호출이 종료 될 때 돌아옵니다. 이것은 소중한 시간을 빼앗아갑니다.

위의 문제는 인라인 함수를 사용하여 해결할 수 있습니다. 이로 인해 컴파일러는 코드를 소스에서 직접 호출합니다. 인라인 함수 코드에 대해 새 메모리 명령어 세트가 생성되지 않습니다.

++ C의 인라인 선언 자유롭 ​​함수가 선언에 정의 될 때 그것은 다음의 규칙 : C에서

  1. 내부 링크 어떠한 기능에 의해 제한된다 (C)에 자동적으로 발생하더라도 인라인으로 선언 할 수 있지만 외부 링키지가있는 함수는 인라인에 제한이 있습니다.

  2. 인라인 키워드가 함수 선언에 사용 된 경우 함수 정의가 동일한 번역 단위에 있어야합니다.

인라인 데이터 형식 FUNCTION_NAME (인수)

이 코드가 아닌 인라인 함수에 비해 30 % fastert의 prcessor 속도에 따라 나머지 개까지 실행됩니다.

이제 전략 부분이 나옵니다. 인라인 함수를 사용할 수는 있지만 인라인 함수의 실행 시간은 훨씬 적지 만 실행시 메모리 점유율이 높다는 점을 명심하십시오. 또한 컴파일러는 인라인 선언 된 코드가 코드 크기에 비해 비정상적으로 큰 경우 인라인 선언을 간과 할 수있는 옵션을 항상 제공합니다.

인라인 선언은 평가 순서를 파괴하지만 함수를 내부로 만들지는 않습니다. 기능은 여전히 ​​외부입니다.

코드 크기 프로그램을로드하는 데 사용되는 메모리 양을 증가 일반적으로, 인라인 코드 — :

8

인라인 기능에 영향을 줄 것으로 메모리 사용량 두 가지 종류가 있습니다. 이는 프로그램에서 생성 된 코드가 여러 개 복사되어 있기 때문입니다. 그러나 이것은 항상 사실이 아닙니다. 인라인 함수가 한 번만 사용 되었다면 변경이 거의없고 인라인 함수가 매우 작 으면 함수 호출 오버 헤드를 제거하여 코드 크기가 완전히 감소 할 수 있습니다. 또한 함수는 특정 인라인 호출에 사용되지 않는 코드를 제거 할 수있는 최적화 프로그램에 의해 크기가 줄어들 수 있습니다.

스택 사용 — 인라인 함수에 많은 로컬 변수가있는 경우 더 많은 스택 공간을 사용할 수 있습니다. C에서 컴파일러는 대개 함수에 대한 스택 공간을 함수에 입력 할 때 한 번 할당합니다.이 값은 레지스터에 저장되지 않은 모든 로컬 변수를 담을 수있을 정도로 커야합니다. 함수를 라인 외로 호출하면 해당 함수의 스택은 다시 릴리스 될 때까지 사용됩니다. 함수를 인라인하면 해당 스택 공간이 uber-function의 전체 수명 동안 계속 사용됩니다.

인라인은 인라인되지 않은 버전에서 발생하는 것처럼 인라인 코드에 대해 동일한 할당 및 할당 취소가 발생하므로 힙 사용에 영향을 미치지 않습니다.