출처: https://www.slideshare.net/TetsuroMatsumura/c20-152189285 ,

https://www.slideshare.net/TetsuroMatsumura/introduction-to-c-modules-part-2-225829715

Module

C++20 에서는 헤더 파일을 대체하는 기능으로 모듈이 도입 되었다.

프리 프로세서를 이용하지 않고 프로그램을 분할 할 수 있다

각각의 경우에 대해서 모듈에 의한 분할로 이행하면 어떻게 될지 샘플코드와 같이 소개한다

헤더 파일 1개의 경우

모듈 선언과 모듈 유닛

모듈 선언은 번역 단위의 선두에서 1회만 쓸 수 있다

모듈 선언을 포함하는 번역 단위를 모듈 유닛 이라고 한다

모듈 이름에는 닷이 사용되지만 특별한 의미는 없다.

모듈 유닛 분할

모듈 선언 형식에 의해서 4개로 분류할 수 있다

         모듈 인터페이스 유닛                               모듈 구현 유닛

   모듈 인터페이스 파티션                                   모듈 구현 파티션

export 선언

모듈 인터페이스 유닛 안에서는 선언을 export 할 수 있다

   export (선언)

   export { (선언) }

export 할 수 있는 선언은 변수, 함수, 타입, 이름 공간, 템플릿 import 등.

(구문 상에서는 어떤 선언도 export는 붙일 수 있다)

export { … }로 감싸면 모아서 export 할 수 있다(스코프는 만들 수 없다).

import 선언

import 선언에 의해 모듈 인터페이스 유닛을 import 한다.

import한 번역 단위에서 import 하고 있는 선언은 보이게 된다

재 export

import 선언을 export 하는 것을 재 export 라고 한다

이런 모듈을 import 하면

재 export 하고 있는 모듈도 동시에 import 한다

헤더 파일 1개와 소스 파일 1개의 경우

인터페이스와 구현

모듈은 인터페이스와 구현으로 나눌 수 있다.

   모듈 인턴

      모듈 인터페이스 유닛                                     모듈 구현 유닛

      -> 헤더 파일에 해당                                       -> 소스 파일에 해당

            export 가능                                                export 불가능

모듈 구현 유닛은 모듈 인터페이스를 암묵적으로 import 한다.

모듈 인터페이스 유닛은 모듈에 1개 존재한다

모듈 구현 유닛의 개수는 임의

모듈 구현 유닛에서는 export 할 수 없다

복수의 헤더 파일의 경우

모듈 파티션

모듈은 부분적인 모듈(파티션)으로 나눌 수 있다

    (프라이머리)                                                     모듈 인터페이스

  모듈 인터페이스 유닛                                          파티션

모듈 파티션은 다른 모듈에서 import 할 수 없고,

동일 모듈 내에서만 import 할 수 있다

파티션의 재 export

프라이머리 모듈 인터페이스 유닛은 모든 모듈 인터페이스 파티션을 재 export 해야한다. 그렇지 않은 경우 ill-formed이지만 진단 되지 않는다

이것에 의해 모듈 인터페이스 파티션에서 export한 선언은 외부에서도 보이게 된다

복수 헤더 파일과 소스 파일의 경우

모듈 구현 파티션

모듈 파티션이면서 모듈 구현이기도 한 번역 단위도 만들 수 있다

     모듈 인터페이스 파티션                                   모듈 구현 파티션

        export 가능                                                      export 불가능

모듈 구현 파티션은 재 export 할 수 없다.

모듈 내외의 의존 관계

파티션은 언제 사용하나?

모듈 파티션의 존재는 외부에서는 알수 없으므로

단독으로 사용할 수 있다면 단독 모듈로 하는 것이 좋다

글로벌 모듈

이름 있는 모듈에 속하지 않는 선언은 글로벌 모듈에 속하게 된다.

글로벌 모듈은 이름이 없고, import 할 수 없다.

글로벌 모듈에서는 export 선언은 할 수 없다

후방 호환성을 위한 기능

기존의 헤더 파일에 의해 제공 되고 있는 라이브러리를 위해 기능이 추가 되었다.

글로벌 모듈 플래그먼트

모듈 선언 전에 글로벌 모듈 구현을 쓸 수 있는 기능

헤더 유닛

특정 헤더 파일을 모듈로서 import 할 수 있는 기능

효과는 #include와 거의 같음

어느 헤더 파일을 import 할 수 있는가는 처리계 마다 다르다

import 할 수 있는 헤더 파일을 #include 하면, import로 치환된다.

모듈 링크 linkage

C++20 에서는 새로운 모듈 linkage가 추가 되었다

(글로벌 모듈 이외의) 모듈 내에서 export 하지 않은 이름은 모듈 linkage를 가진다.

export 하고 있는 이름은 외부 linkage를 가진다.

모듈 linkage를 가진 이름은 동일 모듈 내에서 참조할 수 있다.

모듈로 빌드 속도는 빨라질까?

모듈에 의해서 빌드가 빠르게 되는 원인은 다음과 같다.

  #include와 달리 코드가 전개 되지 않으므로 해석이 빠르게 된다

다만 빌드가 느려지는 원인도 있다

 모듈 의존 관계 순으로 컴파일 해야 하므로 병렬화 하기 어렵다

job 수가 늘어남에 따라서 모듈쪽이 느리게 되지만 일반적인 PC에서는 모듈쪽이 빠르므로 문제가 되지는 않을 것 같다.

private 모듈 플래그먼트

1 파일로 인터페이스와 구현을 나누는 기능

private 모듈 플래그먼트 내에서는 export 선언 할 수 없다

외부에서 도달 가능할 수 없다