인라인 기능을 사용할 때와 사용하지 않을 때?
인라인은 컴파일러에 대한 힌트 또는 요청이며 함수 호출 오버헤드를 피하기 위해 사용됩니다.
그렇다면 어떤 기능이 인라이닝의 후보인지 아닌지는 어떤 기준으로 판단할 수 있을까요?어떤 경우에 인라인 처리를 피해야 합니까?
함수 호출 비용을 회피하는 것은 절반에 불과합니다.
다음 작업을 수행합니다.
inline
#define
- 매우 작은 기능들은 좋은 후보이다
inline
더와 더 작은 파일 에 더 가 있음) : 더 빠른 코드와 더 작은 실행 파일 (코드 캐시에 더 많은 기회가 있음) - 함수는 작고 매우 자주 호출된다
하지 않음:
- 큰 함수: 실행 가능한 파일이 커집니다.콜 오버헤드로 인한 고속 실행과 관계없이 퍼포먼스가 크게 저하됩니다.
- I/O 바인딩된 인라인 함수
- 그 기능은 거의 사용되지 않는다
- 컨스트럭터 및 디스트럭터: 비어 있는 경우에도 컴파일러는 이들을 위한 코드를 생성합니다.
- "CHANGE: "CHANGE: "CHANGE: "CHANGE: "CHANGE:"
- 기존 함수를 인라인화하다
- 인라인 함수를 변경하거나 인라인 함수를 비실행으로 한다: 라이브러리의 이전 버전에서는 오래된 구현이라고 부른다.
라이브러리를 개발할 때 나중에 클래스를 확장할 수 있도록 하려면 다음을 수행해야 합니다.
- 본문이 비어 있는 경우에도 가상 소멸자 추가
- 모든 컨스트럭터를 비대칭으로 하다
- 클래스가 값으로 복사될 수 없는 경우를 제외하고 복사 생성자 및 할당 연산자의 비복사 구현을 작성합니다.
때 주의해 주세요.inline
수 있습니다.또, 「인라인」이라고 않은 으로 할 도 있습니다.컴파일러는 함수를 인라인하지 않기로 결정할 수 있습니다.또, 마크가 붙어 있지 않은 함수를 인라인으로 할 수도 있습니다.inline
저는 기능을 .inline
(아주 작은 함수를 쓸 때는 별도로 할 수 있습니다.
으로 「」를 실시하는이 현명합니다.inline
병목 현상을 나타내는 기능 집합
참고 자료:
- 인라인 또는 비인라인
- [9] 인라인 함수
- C++와의 정책/바이너리 호환성 문제
- GotW #33: 인라인
- 인라인 리덕스
- 유효 C++ - 항목 33: 적절한 인라인 사용
편집: Bjarne Strustrup, C++ 프로그래밍 언어:
는 '하다'로 정의할 수 .
inline
. : :
inline int fac(int n)
{
return (n < 2) ? 1 : n * fac(n-1);
}
inline
는, 「Specifier()」의 콜에 하려고 하는 에 나타내는 입니다.fac()
inline은 함수의 코드를 한 번 설정하고 나서 통상의 함수 콜메커니즘을 통해 호출하는 것이 아닙니다. "C"를 할 수 .720
의fac(6)
함수,되거나 반복되지 않는 에, 의inline
함수는 실제로 삽입되어 있습니다.규정할 수 될 수 .720
또 다른 ,6 * fac(5)
및 또 되지 않은 콜, 「」 「」.」fac(6)
비정상적으로 교묘한 컴파일 및 링크 기능이 없는 경우에 인라이닝을 가능하게 하려면 선언뿐 아니라 인라인 함수의 정의(「9.2면)을 사용하다 안
inline
essspecifier의 을 주지 .는 아직 , 그 에 다음과 같이 되어 있습니다.static
제7.1.2항
EDIT2: ISO-IEC 14882-1998, 7.1.2 기능 지정자
「(8.3.5, 9. 11.4)」가 붙은 9.3, .4
inline
이치노인라인 지정자는 콜 포인트에서의 함수 본체의 인라인 치환이 통상의 함수콜 메커니즘보다 우선함을 실장에 나타냅니다.콜 포인트에서 이 인라인 치환을 실행하기 위해 구현이 필요한 것은 아닙니다.다만, 이 인라인 치환을 생략해도, 7.1.2 로 정의되고 있는 인라인 기능의 다른 룰은 계속 존중됩니다.
inline
최적화와는 거의 관계가 없습니다. inline
는 주어진 정의가 프로그램에서 여러 번 발생할 경우 오류를 생성하지 않도록 컴파일러에 지시하는 명령이며, 이 정의는 사용되는 모든 번역에서 수행되며 나타나는 모든 번역에서 정확히 동일한 정의를 갖는다는 약속입니다.
룰 「」을 해 주세요.inline
선언에만 필요한 추가 종속성을 포함하여 몸이 필요하지 않은 짧은 기능에 적합합니다.정의가 발견될 때마다 해당 정의를 구문 분석해야 하며 본문에 대한 코드가 생성될 수 있으므로 단일 소스 파일에서 단 한 번만 정의된 함수에 대한 일부 컴파일러 오버헤드를 암시합니다.
컴파일러는 선택한 함수 호출을 인라인(즉, 함수에 대한 호출을 해당 함수의 동작을 실행하는 코드로 대체)할 수 있습니다.예전에는 콜과 같은 변환 단위로 선언되지 않은 함수를 "분명히" 인라인화할 수 없었지만, 링크 시간 최적화의 사용이 증가함에 따라 이 경우에도 마찬가지입니다.마찬가지로 함수가 표시된 사실도 마찬가지입니다.inline
인라인을 사용할 수 없습니다.
컴파일러에게 함수를 인라인화하도록 지시하는 것은 최적화이며, 최적화의 가장 중요한 규칙은 섣부른 최적화가 모든 악의 근원이라는 것입니다.항상 (효율적인 알고리즘을 사용하여) 명확한 코드를 작성한 다음 프로그램을 프로파일링하고 시간이 너무 오래 걸리는 기능만 최적화하십시오.
특정 함수가 매우 짧고 단순하며 좁은 내부 루프로 수만 번 호출되는 경우 좋은 후보일 수 있습니다.
그러나 많은 C++ 컴파일러가 자동으로 작은 함수를 인라인화하며 인라인화 요구도 무시할 수 있습니다.
섣부른 최적화는 모든 악의 근원이다!
경험적으로 저는 보통 "getters"와 "setters"만 인라인합니다.코드가 동작하고 안정되면 프로파일링을 통해 어떤 기능이 인라이닝에 도움이 되는지 알 수 있습니다.
한편, 대부분의 최신 컴파일러는 매우 뛰어난 최적화 알고리즘을 갖추고 있으며, 사용자가 인라인에 넣어야 할 것을 인라인화합니다.
다시 제안 - 인라인 원라인 함수를 작성하고 나중에 다른 함수에 대해 걱정합니다.
방법은 번를 CPU 사이클로 입니다.inline
작다함수 콜의 오버헤드가 함수에 소비된 시간에 비해 무시할 수 있는 수준이면 인라인으로 하는 것은 의미가 없습니다.
또한 캐시를 놓칠 정도로 성능 중요 코드로 자주 호출되는 작은 함수가 있는 경우 이러한 함수도 인라인 방식으로 해야 합니다.다시 말씀드리지만 프로파일러가 말씀드릴 수 있는 내용입니다
최적화가 아니라 코드를 읽기 쉽게 하기 위해 인라인 함수를 사용하는 경우가 많습니다.코드 자체가 댓글이나 설명적인 이름보다 짧고 이해하기 쉬운 경우가 있습니다.예를 들어 다음과 같습니다.
void IncreaseCount() { freeInstancesCnt++; }
독자는 코드의 완전한 의미를 즉시 알 수 있습니다.
가장 좋은 방법은 인라인과 인라인 이외의 명령어를 검토 및 비교하는 것입니다. ,, 상, 항, 항, 항은 생략하는 것이 합니다.inline
.★★★★★★ 。inline
을 사용법
인라인 함수는 인수를 스택에 푸시할 필요가 없으므로 코드 성능을 향상시킬 수 있습니다.문제의 함수가 코드의 중요한 부분에 있는 경우 프로젝트의 최적화 부분에서 인라인이 아닌 결정을 내려야 합니다.
인라인에 대한 자세한 내용은 c++ FAQ를 참조하십시오.
함수 코드가 작을 때만 인라인 함수 한정자를 사용해야 합니다.기능이 클 경우 메모리 공간을 절약하는 것이 실행 속도를 비교적 작게 희생시킬 가치가 있기 때문에 일반 기능을 선호해야 합니다.
저는 보통 3~4개의 간단한 문장으로 함수를 만드는 썸 규칙을 따릅니다.그러나 이는 컴파일러에 대한 힌트에 불과하다는 것을 기억하는 것이 좋습니다.인라인화 여부를 결정하는 최종 호출은 컴파일러에 의해서만 이루어집니다.이 수보다 많은 문장이 있을 경우, 나는 멍청한 컴파일러와 같이 인라인을 선언하지 않을 것이다.그것은 코드 블러트를 일으킬 가능성이 있다.
인라인을 사용할지 여부를 결정할 때는 보통 다음 점에 유의합니다.최신 시스템에서는 메모리 지연 시간이 원시 계산보다 더 큰 병목현상이 될 수 있습니다.자주 호출되는 인라인 함수는 실행 파일 크기를 늘리는 것으로 알려져 있습니다.또한 이러한 함수는 CPU의 코드 캐시에 저장되므로 해당 코드에 액세스해야 할 때 캐시 누락 횟수가 감소합니다.
따라서 스스로 결정해야 합니다.inlining은 생성된 기계 코드의 크기를 증가시키거나 감소시키나요?함수를 호출하면 캐시 누락이 발생할 가능성이 얼마나 됩니까?코드 전체에 퍼져 있다면 가능성이 높다고 생각합니다.단일 타이트루프로 제한될 경우 가능성은 낮아집니다.
아래에 열거한 케이스에서는 일반적으로 인라인을 사용합니다.그러나, 당신이 진정으로 퍼포먼스에 관심을 갖는다면, 프로파일링은 필수적입니다.또한 컴파일러가 실제로 힌트를 얻었는지 여부를 확인할 수 있습니다.
- 촘촘한 루프에서 호출되는 짧은 루틴.
- 매우 기본적인 액세스 기능(get/set)과 래퍼 기능.
- 안타깝게도 헤더 파일의 템플릿코드는 인라인힌트를 자동으로 가져옵니다.
- 매크로처럼 사용되는 짧은 코드(예: min() / max())
- 짧은 수학 루틴.
또한 인라인 방식은 대규모 프로젝트를 유지관리할 때 심각한 부작용이 있습니다.인라인 코드가 변경되면 이를 사용하는 모든 파일이 컴파일러에 의해 자동으로 재구축됩니다(좋은 컴파일러입니다).이렇게 하면 개발 시간이 많이 낭비될 수 있습니다.
「 」의 inline
메서드는 소스 파일로 전송되고 더 이상 삽입되지 않습니다.프로젝트 전체를 재구축해야 합니다(적어도 이것은 제 경험입니다).또한 메서드가 인라인으로 변환될 때도 마찬가지입니다.
코드가 인라인으로 사용할 수 있을 정도로 작다고 생각되면 인라인 함수를 기억하면 코드를 복제하여 붙여 넣습니다.이 함수가 호출되면 실행 시간을 늘릴 수 있지만 메모리 소비도 증가합니다.loop/static variable/recursive/switch/goto/Virtual 함수를 사용하는 경우 인라인 함수를 사용할 수 없습니다.가상은 런타임까지 대기하고 컴파일 중 인라인은 동시에 사용할 수 없도록 하는 것을 의미합니다.
답을 몇 개 읽었는데 빠진 게 있더군요.
인라인을 사용하지 않는 한 인라인을 사용하지 않는 규칙을 사용합니다.바보같이 보이는데, 이제 설명이 되네요.
컴파일러는 충분히 스마트하고 짧은 함수는 항상 인라인으로 만듭니다.또한 프로그래머가 지시하지 않는 한 긴 함수를 인라인으로 만들지 않습니다.
인라인은 컴파일러에 대한 힌트 또는 요청이라는 것을 알고 있습니다.
★★★★★★★★★★★★★★★★★.inline
컴파일러의 . 그 뒤에 컴파일러가 나옵니다.선택사항이 없습니다.inline
키워드를 지정하면 모든 코드가 인라인 상태가 됩니다. 때문에 절대 하지 않습니다.inline
키워드 및 컴파일러는 최단 코드를 설계합니다.
용기시를 할 때inline
일부 코드를 인라인으로 만들 때 사용합니다.저는 한 가지 예만 알고 있습니다. 왜냐하면 한 가지 상황에서만 사용하기 때문입니다.사용자 인증입니다.
예를 들어 다음과 같은 기능이 있습니다.
inline bool ValidUser(const std::string& username, const std::string& password)
{
//here it is quite long function
}
이 기능은 아무리 크더라도 소프트웨어를 크래킹하기 어렵기 때문에 인라인으로 하고 싶습니다.
언급URL : https://stackoverflow.com/questions/1932311/when-to-use-the-inline-function-and-when-not-to-use-it
'programing' 카테고리의 다른 글
$(명령어)라는 명령어를 달러 기호와 괄호 안에 넣는 것은 셸에서 무엇을 의미합니까? (0) | 2023.04.13 |
---|---|
Interface Builder로 작성된 nib 파일을 사용하여 UIView를 로드하는 방법 (0) | 2023.04.13 |
'COLLATE SQL_Latin1_General_CP1'이란CI_AS는? (0) | 2023.04.08 |
쿼리에 의해 반환되는 각 행에 대해 저장 프로시저를 한 번 실행하려면 어떻게 해야 합니까? (0) | 2023.04.08 |
왼쪽의 varchar를 특정 길이로 패딩하는 가장 효율적인 T-SQL 방법? (0) | 2023.04.08 |