본문 바로가기

반응형

진리는어디에/C++

(43)
[C++20] 모듈(module) 컴파일 성능 비교 들어가며 C++의 프로젝트의 규모가 점점 커짐에 따라 프로젝트 빌드 속도도 그에 비례해 늘어나게 된다. 심한 경우는 오타하나 수정했는데 빌드하느라 몇 십분이 소모되기도 한다. 아무것도 하지 못하고 빌드 프로그래스바만 바라보고 있어야 한다는 것은 엄청난 인력과 시간의 낭비가 아닐 수 없다. 여기에 나와 같은 고민을 하든 분들을 위한 반가운 소식이 있다. C++20 스펙에 추가된 모듈(module)을 사용하면 단순 헤더 파일을 사용하는 것 보다 훨씬 빠른 컴파일 속도를 얻을 수 있다고 한다. 모듈이 궁금하신 분들은 '[C++20] 모듈(module)' 포스트에서 보다 자세한 내용을 확인 할 수 있다. 이번 포스트에서는 이 모듈이 어떻게 헤더파일을 사용하는 것 보다 빠른 컴파일 속도를 제공하는지에 대해 간단하..
[C++] type traits 기초 들어가며 type traits는 C++ 템플릿 메타 프로그래밍에서 꽤나 유용하게 쓰이는 기술중에 하나다. 여러분은 type traits를 이용하여 '타입'의 다양한 속성들에 대해 조사하거나, 타입의 프로퍼티를 변경할 수 있다. 예를 들어 제네릭타입 T가 있다고 가정하자. T는 int도 될 수 있고, bool, std::vector 또는 다른 어떠한 타입도 가능하다. template class Widget { // ... }; 여러분은 type traits를 이용하여 제네릭 템플릿 인자로 넘어온 타입 T가 int형인지, 함수인지, 포인터인지 아니면 클래스인지, 클래스라면 소멸자를 가졌는지, 복사가 가능한지, 예외를 던지는지 아닌지 등등 다양한 것들을 조사 할 수 있다. 이런 타입에 대한 정보들은 조건부 컴..
[C++20] 당신이 모듈(module)을 써야만 하는 이유 들어가며 C++의 모듈(module)은 concepts, ranges, coroutine과 더불어 'Big Four'이라고 불려지며 C++20 스펙에 추가된 네 가지 주요 요소 중에 하나다. 모듈은 기존 헤더 파일을 대체할 수 있을 뿐만 아니라, 컴파일 시간 개선, 매크로 격리(macro isolation, 용어가 생소하지만 뒤에 설명이 나온다)등을 제공한다. 간단하게 정리하면 #include 전처리 방식을 대신할 수 있는 새로 도입된 개념으로써 java의 package나 C#의 namespace와 동일한 역할을 한다. 모듈의 도입으로 C++에 어떠한 변화가 생겼는지 알아 보기 위해 우리는 기존 C++은 어떤 모습이었는지 먼저 살펴 볼 필요가 있다. 기존 C++의 구조를 보기 위해 그 유명한 "Hello..
[C++20] 모듈(module) 모듈(module) 이란? C++20 이전의 C++에서는 필요한 함수 또는 클래스를 불러오기 위해 #include 전처리문을 이용해 왔다. 이런 헤더 파일 방식의 문제는..많지만 그 중에 필자가 가장 크리티컬하게 생각하는 부분은 #include 전처리문을 가리키고 있던 파일의 내용 그대로 치환해버려 헤더에 있는 필요하든 필요하지 않든 상관 없이 정의 되어있는 모든 기능을 포함하게 된다는 것이다. 예를 들어 cmath 헤더 파일에서 정작 내가 필요한 기능은 acos함수 하나 뿐이지만, acos를 사용하기 위해서 나는 헤더에 정의된 모든 함수들을 인클루드하고 컴파일 해야만 한다. 이미 현재 다른 언어들에서는 필요한 기능만을 가져 올 수 있는 기능을 제공하고 있지만 C++은 이번 C++20 스펙의 module..
[C++20] 어트리뷰트(Attribute) attribute는 C++11 부터 지원되는 기능으로써 자료형, 객체, 코드등에 대하여 속성(attribute)을 설명하는 단일화된 표준 문법을 제공한다. 예를 들어 GNU와 IBM에서는 __attribute__(...))가 있었고, MS 비주얼 스튜디오에는 __declspec()이 제공하던 기능들이 C++11 부터 언어 자체에 포함 된 것이다. attribute는 컴파일러에 추가 정보를 전달하는 것으로써 자료형, 객체, 코드등에 대하여 속성을 지정하여 구현된 내용이 속성과 부합하지 않는다면 경고 또는 에러를 출력한다. 컴파일 타임에 코드의 내용을 분석해서 attribute와 맞지 않는다면 컴파일 에러 또는 경고를 발생 시키므로 주석보다는 가능하다면 attribute를 사용하도록 하자. atturbute..
[C++20] Feature Test Macro Feature Test Macro는 C++에서 제공하는 기능을 현재 사용 중인 컴파일러가 지원하는지 그렇지 않은지 여부를 테스트하기 위한 전처리 명령어(매크로)다. Attributes __has_cpp_attribute( attribute-token ) 현재 사용하는 컴파일러가 attribute-token에 지정된 attribute를 지원하는지 체크 #if, #else, #ifdef, #ifndef를 이용해 컴파일 타임에 지원 여부 체크 가능 int main() { #if __has_cpp_attribute(carries_dependency) std::cout
[C++20] 코루틴(Coroutine) - co_return 코루틴을 종료하기 위해선 co_return을 호출한다. Task foo() { co_return; } co_return은 값을 리턴 할 수도 있고, 아무런 값도 리턴하지 않고 단순히 코루틴을 종료하기만 할수도 있다. 값을 리턴하느냐 그렇지 않느냐에 따라 코루틴 함수의 리턴 타입이 가져야 하는 요구사항이 달라진다. 코루틴의 리턴 타입에 어떠한 것들이 필요한지 아래 예제를 통해 알아 보도록 한다. 컴파일러는 co_return 키워드를 만나면 아래와 비슷한 코드를 생성한다. Task foo() { promise.return_void(); co_await promise.final_suspend(); } 컴파일러는 co_return 대신에 promise와 co_await를 생성한다. foo() 함수는 아무것도 리..
[C++20] Concepts 이번 포스트에서는 C++20에 추가된 아주 강력한 기능 중 하나인 concept이라는 것에 대해 알아 보도록 한다. 들어가며 이번 포스트에서는 C++20에 추가된 Concepts에 대해 살펴 보도록 하겠다. 이 글을 읽는 여러분은 아래 세 가지를 배우게 될 것이다. Concepts를 만드는 방법 C++에서 제공하는 표준 Concept 'Requires 절' 문법 Concept란? 먼저 많은 분께 생소한 개념인 Concept에 대해 알아 보자. C++20 공식 문서에 따르면 C++의 Concept 이란, "타입이 가져야 하는 요구 조건을 정의하는 문법"이라고 소개하고 있다. 영어로는 "Named sets of requirements", 즉 "이름을 가진 요구조건의 집합"이다. "타입이 가져야 하는 요구 조..
[C++20] Ranges 이번 장에서는 C++20에서 추가된 range 라이브러리에 대해서 알아 보겠습니다. 처음에 새로운 라이브러리가 추가 되었다고 해서 새로운 패러다임이 가미된 엄청 복잡한 뭔가일 것이라 지레 겁을 먹고 시작했지만..사실 std::list, std::vector와 같은 자료 구조에 범위기반 알고리즘을 제공하는 편리하고 간단한 라이브러리 입니다. C++11에서 auto 키워드와 ranged for를 추가하여 길고 번거로운 iterator를 이용한 순회 코드를 간단하게 만들어 준것 처럼 C++20에서는 더 간단한 범위 기반 연산 함수들을 제공합니다. Range? C++20에서 부터 추가 되는 std 라이브러리 range는 아래와 같이 정의 되고 있습니다. 아이템들의 추상적인 집합 순회 가능해야 한다. begin(..
[C++20] 코루틴(Coroutine) - 예제 Coroutine.h #ifndef _COROUTINE_H_ #define _COROUTINE_H_ #include #include template class Coroutine { private: class Impl; struct promise_base { INITIAL_SUSPEND initial_suspend() { return INITIAL_SUSPEND{}; } std::suspend_always final_suspend() noexcept { return {}; } void unhandled_exception() { throw std::exception("unhandled exception"); } }; template struct promise_type_impl : public promise_..

반응형