작성
·
70
1
inline 함수 정의부를 복사하여 호출부에 삽입하는 최적화를 부탁하는 역할 - 컴파일러에게 요청
동일한 헤더파일을 포함하는 복수의 .cpp파일이 링커에 의해 파일이 합쳐질때 함수의 중복 정의를 피하기 위한 역할 - 링커에게 요청
으로 2가지가 있는걸로 알고 있습니다.
헤더파일의 클래스 정의부에서 함수 선언과 정의가 이루어지면 암시적으로 inline키워드가 붙느걸로 알고있는데요. 이 경우에는 2번의 역할때문에 붙여지는걸로 압니다.
그런데 해당 inline키워드를 컴파일시점에서 최적화 할 것으로 해석해도 객체의 함수를 호출할 때 해당 클래스의 함수테이블을 참조하여 호출하기 때문에 컴파일 시점에 최적화가 이루어져도 함수 테이블 등록 시점에는 결국 일반함수화가 될거라고 이해했는데요.
하지만, 멤버 함수가 1번의 역할을 수행하여 실제 최적화도 이루어진다. 라고 하길래.... 그렇다면 1번의 역할을 수행하려면 정적인 객체, 컴파일 시점에 자료형이 확정되는 객체여야 하나? 라는 생각도 듭니다.
공식 문서를 찾아봐도 명쾌한 답변이 없어서 질문글 남깁니다. 시점에 따라 다른지, 컴파일러 기분에 따라 다른지.... 많이 헷갈리네요ㅜ
답변 2
0
안녕하세요? 질문&답변 도우미 durams입니다.
말씀하신 inline
키워드의 의미 중 첫 번째는 C에서부터 이어져 온, '가능하다면 함수 호출 부분을 함수 body로 치환하여 최적화해주세요'라는 요청입니다. 하지만 C++에서는 C++98부터 이미 두 번째 의미로 바뀌었다고 보는 것이 적절합니다.
대신 1번에서 말씀하신 최적화(함수의 body를 호출 부분에 복사하는 것)는 컴파일러의 판단 하에 자동적으로 수행됩니다. 아마 질문글에서 말씀하신 '멤버 함수가 1번의 역할을 수행하여 실제 최적화도 이루어진다. 라고 하길래`가 이러한 것을 가리킨 것이 아닐까 싶네요.
아래부터는 1번 의미를 '인라인화'라고 부르겠습니다.
컴파일 타임에 무언가가 확정되어야 할 것 같다고 생각하신 것은 굉장히 좋은 통찰이십니다. 대신 객체 자체의 duration이나 객체의 타입이 중요하다기보다는, 어떤 함수를 호출해야할 지 확정되는 그 시점(바인딩 시점)이 중요하겠죠.
종합해보면, 함수의 호출 부분을 함수의 body와 치환해야 하는데 그것을 컴파일 타임에 알아야 하기 때문에 해당 함수는 정적 바인딩되어야합니다.
반대로 virtual
함수와 같은 동적 바인딩의 경우는 컴파일 타임에 호출할 함수를 알 수 없으니, 인라인화도 이루어질 수 없을겁니다.
다만 함수가 정적 바인딩된다고 해서 꼭 인라인화가 이루어지리란 보장은 없습니다. 현대 컴파일러의 최적화 기술은 매우 복잡하고 고도화되어있기 때문에, 특정 상황에 특정 최적화가 적용된다고 단언할 수는 없다고 알고 있습니다.
따로 강의 영상을 지정하여 질문글을 달아주시지 않아 정확히 어떤 포인트를 궁금해하시는지 제가 파악하지 못했을 수도 있습니다. 추가로 궁금한 점이 있으시다면 질문주세요.
'컴파일 시점에 최적화가 이루어져도 함수 테이블 등록 후 호출 시점에는 결국 일반함수화가 된다' 라는 말을 제가 이해를 잘 못해서 다시 질문을 드리고 싶어요. 일반함수화라는 것이 일반적으로 호출(call)하고 반환(return)하는 형태가 된다는 뜻일까요?
그렇다면 클래스 멤버 함수의 경우에는 최적화(인라인화)가 적용되더라도 결국 런타임에는 일반 함수와 같이 사용된다라는 뜻인데, 멤버 함수도 인라인화가 적용될 수 있습니다.
실제로 아래 링크는 MSVC 컴파일러 옵션 중 인라인화를 제어하는 것에 대한 문서입니다. (인라인화라는 단어를 영어로 inlining이라고도 하고, inline expansion이라고도 합니다)
https://learn.microsoft.com/en-us/cpp/build/reference/ob-inline-function-expansion?view=msvc-170
이 중에서 /Ob1
에 대한 설명을 보시면, 아래와 같이 클래스 멤버 함수도 언급됩니다.
Allows expansion only of functions marked inline, inline,orforceinline, or in a C++ member function defined in a class declaration.
그리고 이러한 옵션도 최적화가 '이루어 질 수도 있음'을 켜고 끄는 것이지, 무조건 일어남을 보장하지 않는다는 것을 기억해주세요.
정적바인딩이 이루어진 함수라 할지라도 (인라인화가) 컴파일러에게 달려있나요? - 네 그렇습니다.
강의 영상을 지정해주시면 답변에 약간의 도움이 되기는 하지만, 특정 영상 내용에 종속된 질문이 아니라면 카테고리가 없어도 괜찮습니다. 전혀 죄송하실 필요가 없어요!
작성해주신 내용만으로도 어떤 것을 궁금해하고 계신지 유추해서 답변드리니 신경쓰지 않으셔도 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. dzzzing님.
inline 키워드는 C++에서 복잡한 개념으로, 두 가지 주요 목적과 관련이 있습니다. 하나는 성능 향상을 위한 최적화 요청이고, 다른 하나는 다중 정의 방지를 위한 것입니다.
최적화 목적: inline 함수는 함수의 호출을 최적화하기 위해 사용됩니다. 컴파일러는 함수 호출을 하면서 함수의 호출부를 기계어 코드로 직접 삽입하는 방식으로 최적화할 수 있습니다. 이렇게 하면 함수 호출 오버헤드를 줄일 수 있습니다. 이는 주로 작은 함수에서 유용합니다. 컴파일러가 최적화를 수행할지 여부는 컴파일러의 성능 및 구현 방식에 따라 다를 수 있습니다.
중복 정의 방지: 헤더 파일에서 함수의 정의가 이루어질 경우, 동일한 헤더 파일을 여러 소스 파일에 포함시키면 함수의 중복 정의가 발생할 수 있습니다. 이 때 inline 키워드를 사용하면 컴파일러는 함수를 여러 소스 파일에서 중복 없이 링크할 수 있게 됩니다.
이러한 기능에도 불구하고, inline 키워드는 컴파일러가 반드시 요청을 따를 필요는 없으며, 최종 결정은 컴파일러에게 달려 있습니다. 또한, 클래스 내부에 정의된 멤버 함수는 암시적으로 inline으로 취급되지만, 이것이 반드시 모든 경우에 대해 최적화가 이루어진다는 것을 의미하지는 않습니다.
컴파일 시점에서 정적인 객체나 데이터 타입이 확정되어 있는 경우 최적화가 더 쉽게 이루어질 수 있지만, 이는 컴파일러 구현에 따라 달라질 수 있습니다. C++에서 최적화는 상황에 따라 다르며, 실제 최적화 여부는 여러 요인들에 의해 결정됩니다.
이에 대한 더 자세한 정보는 다음 URL에서 확인할 수 있습니다:
- C++ Inline Functions (GeeksforGeeks)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
앗 개인적으로 공부하다가 올린 질문글이라 카테고리가 없어 죄송합니다!
추가적인 질문으로
"inline키워드가 붙은 객체의 함수를 호출할 때 해당 클래스의 함수테이블을 참조하여 호출하기 때문에 컴파일 시점에 최적화가 이루어져도 함수 테이블 등록 후 호출 시점에는 결국 일반함수화가 된다"는 전적으로 컴파일러에게 달려있고
이말은 정적바인딩이 이루어진 함수라 할지라도 컴파일러에게 달려있다 일까요?