헤더 파일을 고려하십시오.
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
또는 대안 적으로 :
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
사전 모듈 환경에서 이러한 헤더는 ODR 위반없이 여러 TU에 텍스트로 포함될 수 있습니다. 또한 관련 멤버 함수가 비교적 작기 때문에 컴파일러는 해당 함수를 "인라인"(사용할 때 함수 호출을 피함)하거나 일부 인스턴스를 T
모두 최적화 할 수 있습니다 .
C ++ 20이 끝난 회의에 대한 최근 보고서 에서 다음 진술을 읽을 수 있습니다.
우리는
inline
모듈 인터페이스에서 의 의미를 명확하게 설명했다 : 의도적으로 선언inline
되지 않은 함수 본문은 해당 함수 본문이 모듈 인터페이스에 나타나는 경우에도 모듈의 ABI에 속하지 않는다. 모듈 작성자에게 ABI를보다 강력하게 제어 할 수 있도록 모듈 인터페이스의 클래스 본문에 정의 된 멤버 함수는 더 이상 암시 적으로 적용되지 않습니다inline
.
내가 실수하지 않았는지 모르겠습니다. 모듈 세계에서 컴파일러가 함수 호출을 최적화 할 수 있으려면 inline
클래스 내에서 정의 된 것처럼 주석을 달아야 합니까?
그렇다면 다음 모듈 인터페이스가 위의 헤더와 동일합니까?
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
여전히 모듈을 지원하는 컴파일러가 없지만 inline
향후 리팩토링을 최소화하기 위해 적절한 경우 그렇게 사용하고 싶습니다.
inline
키워드가없는 모듈의 함수 는 컴파일러에 의해 인라인되지 않습니다. 맞습니까?