본문 바로가기
C++20/4th Emperor

[C++20 - 4th Emperor] Chapter 02. Module

by song.ift 2023. 7. 25.

GitHub : https://github.com/developeSHG/CPP20-4th_Emperor/commit/7845069f15683d59fe2db806c997dfd7743fe475

 

Module · developeSHG/CPP20-4th_Emperor@7845069

developeSHG committed Jul 25, 2023

github.com

 

 


 

 

C++20에 들어간 모든 기능을 통틀어서, 가장 중요하다 생각.

 

C++20은 다른 언어들에 비해서 속도가 빠른 것이 장점 중 하나. 

반면, 큰 단점은 문법이 복잡한편이다. 빌드 속도도 오래걸리는 편이다. 

실행속도는 빠르다고 했지만, 실행하려면 우선 빌드가 통과해야 되고, 결과물을 추출한 다음 실행하게 되는데 그렇다면, 빌드 속도가 느려진다고 하면 큰 문제가 아닐거란 생각이 들기도 하다.

 

하지만 이것이 큰 프로젝트가 아니라면 상관이 없겠지만, 대부분의 상용화 프로젝트는 처음부터 재빌드를 하게 되면 10분씩걸릴만큼 오래걸린다.

게다가 수정한 코드가 적더라도 다시 기다려야 한다는 점에 있어서, 개발 속도에도 치명적인 영향이 가게 된다. 

 

이런 점에서 Module 이란 기능은 빌드 속도를 많이 개선할 수 있는 점이 생긴다. 

 


 

- Module.cpp

#include <iostream>
using namespace std;

import math;
//import math.time;
// 
// 오늘의 주제 : module (모듈)

import MathPartition;

int main()
{
	// 빌드단계 구분

	// 전처리
	// - #include #define
	// 컴파일
	// - 오브젝트 파일 .obj
	// 링크

	// 기존에 사용하던 방법의 문제점
	// 1) 빌드 속도 (반복된 substitution)
	// 너무 너무 느리다
	// 2) 매크로 (#define)
	// 3) 심볼 중복 정의

	// Module
	// - 모듈은 딱 한번만 import 된다 (중첩되서 빌드가 여러번 되는 일이 없다)
	// - import 순서에 상관 없음 (#define의 순서에 따라 차이가 일어난 걸 방지)
	// - 심볼 중복 정의
	// - 모듈의 이름도 지정 가능
	// - 인터페이스/구현부 분리 관리할 필요 없음

	MathTimeFunc();

	MyFunc();
	MyFunc2();
}

 

- Math.ixx

// 모듈안에서 외부 라이브러리를 사용하고 싶을 때, 선언
module; // global module fragment

// 각종 외부 헤더 추가
// global module 선언하는 부분과 module 시작하는 부분 사이에 외부 라이브러리를 추가
#include <vector>

// module 시작
export module math;

// import module ...

// submodule
// math.time을 import해서 다시 math 모듈에 포함해서 export
export import math.time;

void Internal()
{

}

// 3) namespace를 지정
export namespace math
{
	void TestExport2()
	{

	}
}

 

-Math.Time.ixx

export module math.time; // math 모듈에 속한 time인 모듈 (소속된 모듈)

export void MathTimeFunc()
{

}

 

- MathPartition.ixx

export module MathPartition;

// Partition
// module도 커지게 되면 분할 가능
export import :MathPartition_1;
export import :MathPartition_2;

// 파티션으로 만든 module들은 cpp파일에서 독립적으로 사용할 수 없다.
// (Math_TIme은 독립적이지 않아서 사용 가능)

 

- MathPartition_1.ixx

export module MathPartition:MathPartition_1;

export void MyFunc()
{

}

 

- MathPartition_2.ixx

export module MathPartition:MathPartition_2;

export void MyFunc2()
{

}

댓글