수색…
소개
inline
지정자로 정의 된 함수는 인라인 함수입니다. 인라인 함수는 One Definition Rule 을 위반하지 않고 여러 번 정의 될 수 있으므로 외부 링크가있는 헤더에 정의 할 수 있습니다. 컴파일러에 대한 함수 인라인 힌트를 선언하면 코드 생성 중에 함수가 인라인되어야하지만 보증은 제공되지 않습니다.
통사론
-
inline
함수inline
-
inline
함수 정의 - 클래스 {function_definition};
비고
보통 함수에 대해 생성 된 코드가 충분히 작 으면 인라인 될 좋은 후보입니다. 왜 그렇게? 함수가 크고 루프에서 인라인 된 경우 모든 호출에 대해 큰 함수의 코드가 복제되어 생성 된 바이너리 크기가 부풀어 오르게됩니다. 그러나 얼마나 작은 것이 충분합니까?
인라인 함수는 오버 헤드 호출 기능을 피하기 위해 좋은 방법이 될 것 같다 있지만, 그것은 표시된 모든 기능을하지 않도록 유의해야한다의 inline
인라인된다. 즉, inline
이라고하면 명령이 아니라 컴파일러의 힌트 일뿐입니다. 컴파일러는 함수를 인라인 할 의무가 없으며 무시할 수 있습니다. 대부분 컴파일러가 무시합니다. 현대 컴파일러는 컴파일러가이 함수의 인라이닝 제안을 심각하게 받아 들였을 때,이 키워드가 과거의 흔적이라는 최적화를하는 것이 좋습니다. inline
으로 표시되지 않은 함수조차도 컴파일러가 이점을 얻을 때 인라인됩니다.
연계 지시어로 인라인
현대 C ++에서 inline
을 더 실용적으로 사용하면 연결 지시어로 사용하게됩니다. 선언하지 않고 여러 소스에 포함될 헤더의 함수를 정의 할 때 각 번역 단위에는 ODR (One Definition Rule) 위반을 초래 하는이 함수의 자체 복사본이 있습니다. 이 규칙은 대략 하나의 함수, 변수 등의 정의 만있을 수 있다고 말합니다.이 위반을 피하기 위해 함수 정의를 inline
표시하면 암시 적으로 함수가 내부적으로 연결됩니다.
FAQs
C ++에서 함수 / 메소드에 대한 'inline'키워드는 언제 작성해야합니까?
함수가 헤더에 정의되기를 원할 때만. 함수의 정의가 여러 컴파일 단위에 나타날 수있는 경우에만 더욱 정확하게. 컴파일러가 코드를 최적화하는 동안 컴파일러에게 더 많은 정보를 제공하기 때문에 헤더 파일에 작은 (하나의 라이너에서와 같이) 함수를 정의하는 것이 좋습니다. 컴파일 시간도 증가합니다.
C ++에서 함수 / 메소드에 대한 키워드 'inline'을 작성하지 않아야합니까?
컴파일러가 인라인하면 코드가 더 빨리 실행될 것이라고 생각할 때 inline
추가하지 마십시오.
컴파일러는 언제 함수 / 메소드를 인라인으로 만들지 모를 것입니까?
일반적으로, 컴파일러는 당신보다 더 잘할 수 있습니다. 그러나 컴파일러에는 함수 정의가없는 경우 코드를 인라인하는 옵션이 없습니다. 최대한 최적화 된 코드에서는 대개 모든 개인 메소드가 요청되었는지 여부에 관계없이 인라인됩니다.
참고 사항
비 멤버 인라인 함수 선언
inline int add(int x, int y);
비 구성원 인라인 함수 정의
inline int add(int x, int y)
{
return x + y;
}
멤버 인라인 함수
// header (.hpp)
struct A
{
void i_am_inlined()
{
}
};
struct B
{
void i_am_NOT_inlined();
};
// source (.cpp)
void B::i_am_NOT_inlined()
{
}
함수 인라이닝이란 무엇입니까?
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
int c = add(a, b);
}
위의 코드에서 add
가 인라인되면 결과 코드는 다음과 같이됩니다.
int main()
{
int a = 1, b = 2;
int c = a + b;
}
인라인 함수는 어디에도 보이지 않으며, 몸체는 호출자의 몸으로 인라인 됩니다. 더라면 add
인라인되지 않은 함수가 호출 될 것이다. 새로운 스택 프레임 생성, 인수 복사, 로컬 변수 만들기, 점프 (캐시 미스에 의한 참조의 지역성 손실) 등의 함수 호출의 오버 헤드가 발생해야합니다.