반응형

C++ 39

C++20 Concepts 알아보기 (1)

환영합니다, Rolling Ress의 카루입니다. ​ 오늘은 C++20에 드디어 추가된 concept에 대하여 알아보겠습니다. 템플릿 매개변수에 제약을 거는 거죠. ​ concept이란, 템플릿을 사용할 때 일정한 타입들을 묶어주는 기능이라고 생각하는 게 편합니다. 타입 이름에 별칭을 붙여주는 동시에, 그 자체로 bool값을 가지게 되죠. 에 있는 is_same_v 와 같이 ~_v 변수랑 비슷하다고 보시면 됩니다. 다만, 변수가 아니라 타입으로 쓸 수 있습니다. ​ 선언은 이렇게 합니다. template //반드시 template 필요 concept 컨셉이름 = bool값의 식 또는 requires 구문 // Concepts TS 시절에는 아래와 같은 구문도 지원했으나, 이제는 지원하지 않습니다. // ..

[C++20 특수 강좌] 선택문 최적화를 위한 [[likely]], [[unlikely]]

선택지가 2개 있으면, 그 중 하나를 고를 확률은 일반적으로 50%가 되겠죠. 그러나, 하나가 훨씬 많이 선택될 게 불보듯 뻔한 상황이 있어도, 컴파일러는 그걸 모릅니다. 개발자가 직접 알려줘야 하죠. ​ 그래서 이번에 새로 등장한 특성 [[attribute]] 이 바로 likely입니다. std::cout input; input == 0) { } else { } 위 경우에는 압도적으로 0이 많을 겁니다. 하지만 if문에서 0이 가장 위에 있고, 가장 먼저 실행될 것이니 별 필요성이 느껴지지 않죠. 다음과 같은 경우라면 어떨까요? std::cout input; input) { case 1: break; case 2: break; case 3: [[fallthrough]]; case 4: exit(0); ..

C++ 캐스팅 연산자 성능 비교

안녕하세요, 오늘은 C++의 형변환(캐스팅) 연산자의 성능을 알아보겠습니다. static_cast dynamic_cast reinterpret_cast (type)obj // C-style cast type(obj) // functional cast(변환 생성자 이용) CA클래스를 상속받는 CB클래스를 만들고, who_am_I 메서드를 만들어서 제대로 되었는지 확인해 보겠습니다. 각각 1억번씩 형 변환 테스트를 해보겠습니다. 코드는 위가 싱글스레드, 밑에가 멀티스레드 입니다. #include #include #include #include using namespace std; class CA { public: CA() = default; virtual void who_am_I() const { cout

[C++17 심화 강좌] 스마트 포인터 편리하게 사용하기

장렬히 떠나신 auto_ptr에 대한 내용은 기술하지 않겠습니다. 평소에 자주 쓰는 스마트 포인터는 shared_ptr, unique_ptr 이 둘뿐이라고 생각합니다. shared_ptr p(new int[10], [](int* p){ delete[] p; }); 아마 배열을 쓰신다면 이렇게 쓰시겠죠. 그렇다고 함수객체를 쓰기엔 너무 복잡하니까. 하지만 C++17에선 타입을 T[]라고 쓰는 것만으로도 알아서 다~ 해제해줍니다. shared_ptr p(new int[10]); 하지만 shared_ptr은 tuple이나 array와 달리 Deduction Guide가 존재하지 않습니다. (존재하긴 합니다. weak_ptr이나 unique_ptr일때만....) 그래서 제가 한번 만들어봤습니다. template..

[C++20 특수 강좌] constexpr을 넘어선 consteval

C++11인가요? constexpr 키워드를 통해 함수나 변수에 사용이 가능했습니다. 변수에 사용하면 constexpr + const 효과를 통해 컴파일 타임에 상수로 고정이 되는 역할을 했죠. 매크로를 대체할 수 있었습니다. 함수에 사용하면 inline 효과를 내고, 템플릿 메타 프로그래밍(TMP)와 같이 가독성이 떨어지는 코드를 대체할 수 있었습니다. ​ 하지만 constexpr 함수는 문제가 있죠. inline함수처럼 프로그래머가 constexpr로 선언해도 조건에 부합하지 않으면 암묵적으로 런타임에 실행됩니다. ​ 그런 문제를 해결하기 위해 consteval이 나왔습니다. constexpr보다 좀 더 강력한 키워드라고 보시면 됩니다. consteval은 컴파일 타임에 표현 가능한 식이 아니면 오류..

[C++ 심화 강좌] C++20 <=> Three-way 비교 연산자

환영합니다, Rolling Ress의 카루입니다. ​ 사실 작성한 건 3월...? 정도인데, 어쩌다가 이제서야 올리는지...아무튼 시작하겠습니다. 드디어 이걸 포스팅하는 날이 오네요. 제가 이해하는데도 상당한 시간이 걸린, Three-way Comparsion Operator 입니다. 이건 다른 것보다 클래스에서 비교 연산자를 만들 때 특히 도움이 되겠더라고요. , =, ==, != 정의할 필요 없이 auto operator 한방이면 끝납니다. ​ 일단 이게 무엇인지는 알아야겠죠. 그 전에, 중학교 3학년 수학에서 배우셨을 법한 실수의 대소비교에 대해서 알아보도록 하겠습니다. ​두 실수 a, b에 대해 반드시 위 세 가지 중 하나가 성립하죠. 한 실수에서 다른 실수를 뺀 값을 0과 비교하면 크기를 알 수..

[C++심화 강좌] C++20 모듈 사용하기

환영합니다, Rolling Ress의 카루입니다. ​ 처음에는 무척 기다렸고 신기한 기능이었는데, 막상 추가가 되니까 생각보다 별 감흥이 없네요. 아니면 요즘 제가 UWP 앱 개발 중이라 C#에 너무 에너지를 쏟고 있는 탓인지도 모릅니다. 비주얼스튜디오에서 C#을 사용할 땐 정말 막강한 인텔리센스를 제공하죠. ​ 그래서 말인데, 오늘 할 얘기도 인텔리센스에 관해 먼저 이야기하겠습니다. 우선 몇 년 전과는 달리 최근에는 모듈 지원이 대폭 강화되면서 ixx 파일에 대한 인텔리센스도 제공이 됩니다. 심지어 모듈을 import 한 후에도 인텔리센스가 되긴 되는데, 클래스 내부 멤버들까지는 모르는 것 같아요. 컴파일은 잘 되는데 소스 편집기에서 빨간 줄이 사라지지 않는 요상한 상황이 발생합니다. ​ 아무튼, 아실..

[카루의 C++ 강좌] 3-4. switch문과 [[fallthrough]], [[likely]]

다중 if문을 기억하시나요? if (조건식) { } else if (조건식) { } else if (조건식) { } else { } 그런데, 이러한 if문은 길어지면 길어질수록 보기 피곤하고 코드가 너무 길어집니다. 성적을 입력받고 다음과 같이 출력하는 프로그램을 만들어보죠. 100점이면 => A+ 출력 90 ~ 99 점이면 => A 출력 80 ~ 89 점이면 => B 출력 70 ~ 79 점이면 => C 출력 60 ~ 69 점이면 => D 출력 50 ~ 59 점이면 => E 출력 그 외이면 => F 출력 우선 성적을 입력하는 것이므로 0~100인지 검사를 먼저 해야겠죠? 따라서 코드는 이렇습니다. #include int main() { int score{}; std::cout > score; if (sc..

[카루의 C++ 강좌] 3-3. 반복문의 중첩, 무한반복과 break

반복문의 중첩 3-1에서 배웠던 반복문 for, while, do~while문을 기억하시나요? 앞으로는 do~while문은 거의 쓰지 않고 for과 while을 주로 쓸 것입니다. (그래서인지 구글은 Go언어에서 반복문을 for만 사용합니다...) 이 반복문은 중첩이 가능합니다. 구구단을 출력하거나, 흔히 예제로 많이 쓰이는 "별 찍기"도 반복문을 응용하는 것입니다. #include int main() { for (int i{2}; i

반응형