Modern C++ 7

[C++] C++의 Exception Handling과 Exception Mechanism

개요 우리가 프로그램을 개발하는 것에 있어서 중요한 요소는 기능, 최적화 등 다양한 요소가 있지만 가장 중요한 것은 프로그램 동작과정에서 발생한 문제를 빠르게 발견하고 해결하는 것이다. 그러기 위해선, 당연하게도 문제가 발생한 위치를 파악해야 하는데,이 과정은 쉽지 않다.  만약, 컴파일러에 의해 에러를 사전에 발견할 수 있다면, 아주 운이 좋은 상황이거나, 그다지 큰 문제가 아니다.하지만 대부분의 문제점은 반드시 런타임(RunTime) 중에 발생한다. 그렇다고 매번 똑같은 시점에 에러가 발생된다?그것 또한 아니다. 언제 어떠한 원인으로 발생할지 아무도 모른다. 이는 우리가 백날 코드를 살펴본다 한들 파악하기 어렵다.   어떻게 하면 이러한 문제점을 쉽게 파악할 수 있을까?라고 하면 다음과 같은 방법을 ..

Modern C++ 2024.12.13

[C++] chrono vs ctime

서버 프로그래밍을 수행할 때, 시간과 관련된 요소를 자주 사용하기 마련이다. 예를 들면, 서버에서 게임 업데이트 로직을 함께 굴리거나, 송수신 딜레이를 파악해 수용 가능 인원을 넘어선 연결을 차단하는 등이 있다.  과거, C/C++언어 프로그래밍을 배웠던 사람들은 을 활용해 시간과 관련된 다양한 조작을 수행했다. 하지만 그렇게 잘 디자인된 라이브러리는 아니다. 정확도가 1초 단위가 한계이기 때문이다. 사람을 기준으로 1초는 매우 짧은 시간이지만, 1초에도 수만 번의 연산을 수행하는 컴퓨터 입장에선 아주 느린 단위이다. 이는 컴퓨터에서 수행하는 짧은 시간 단위의 연산 간의 정확한 시간 측정을 위해 활용하기 어렵다. 하물며 요즘은 그래픽 렌더링도 1/120초 단위로 이루어지는 게 태반이다.   이를 개선한 ..

Modern C++ 2024.11.26

[C++] 유용한 <Algorithm> 함수들 (1) (정렬, 파티셔닝, 탐색, 숫자)

해당 게시글에선 C++에서 제공하는 Algorithm 함수 중 유용하다가 생각되는 것만 모아서 정리한 것이다.더 많은 내용을 살펴보려면 cppReference.com을 방문해서 탐색해 보는 것을 추천한다. 1. 선수학습 내용 알고리즘 함수를 다루기 이전엔 반드시 다음 사항을 미리 학습해야 한다.   1) Iterator   Algorithm 함수들의 경우, 컨테이너 내부의 특정 범위의 요소에 대해서 다양한 기능을 제공하기 때문에, 이와 관련된 개념을 숙지해야 할 필요가 있다.    2) Predicate Algorithm 함수들의 기능을 제대로 활용하기 위해선 (Ex std::sort의 정렬 기준을 바꾼다.) Predicate를 직접 작성해야 할 필요가 있다. 이와 관련되어 다룬 게시글이 있으니 한 번 ..

[C++11 ~] Predicate와 Functor 그리고 Lamda Expression

C++ 언어를 활용해 코딩 테스트 문제를 풀거나 프로젝트를 진행하는 과정에서 유용한 기능을 얻기 위해 헤더를활용해야 하는 상황이 자주 발생한다. 이때 이 함수들을 효과적으로 활용하기 위해선 Predicate에 관해 제대로 알고 넘어가야 한다.  오늘은 이 Predicate에 관한 내용과 Predicate를 구현하기 위한 다양한 방법인 Functor 와 Lamda에 관해 자세하게 다뤄볼 것이다.0. Predicate Predicate라는게 뭘까?라는 질문을 받는다면, 나는 간단하게 한 문장으로 표현할 것이다.어떠한 조건을 판별하는 함수처럼 동작하는 것들. "함수 처럼 동작하는 것들"라고 다소 추상적으로 표현했는데, 그 이유는 Predicate를 작성할 때 Fuctor, Lamda, 함수 정의 등 다양한 ..

[C++20] std::jthread 와 std::stop_source & std::stop_token

이전 시간에는 C++11부터 제공되는 std::thread에 관해 알아보았었는데, C++20부터는 std::thread의 개선 버전인 std::jthread (joining thread)가 등장하였다. 해당 게시글에서는 std::jthread가 기존 std::thread에 비해 어떤 기능이 추가되었는지, 그리고 이를 활용해 간단한 예시 코드를 작성해볼 예정이다.   std::jthread는 std::thread의 확장된 interface와 RAII( Resource acquisition is initialization ) 모델이 적용된 개체이다. jthread는 private 멤버로 std::stop_source( C++20 )라는 개체를 가지고 있는데 이는 후에 설명하도록 하겠다. 안전한 자원 사용과 ..

Modern C++ 2024.08.07

[C++11] std::thread의 Callable Unit의 매개변수 전달 방식

이번 시간에는 std::thread 생성 시, 호출하는 콜러블 유닛의 매개변수를 어떤 방식으로 전달할 수 있는지에 관해 알아볼 것이다.  일단, std::thread는 기본적으로 콜러블 유닛의 인자를 "복사"의 형태로 전달한다.이 점은 매우 중요한 포인트이니 기억해두자.  그리고 콜러블 유닛의 매개 변수로는, 우/좌측값 참조 타입(&/&&)부터, 복사, 이동, 가변 인자까지 다양한 형태로전달해줄 수 있다.  스레드 생성 시, 두 번째 인자부터 콜러블 유닛에서 사용할 매개변수 인자를 차례대로 넣어주면 된다. 일단 가장 간단한 복사 전달 방식부터 살펴보자.//...void TaskCopy(__int32 param){ std::cout  copy_thread는 TaskCopy라는 콜러블 유닛을 호출하며, 정수..

Modern C++ 2024.07.16

[C++11] std::thread의 생성과 생명 주기

이번 시간에는 C+11 부터 제공되는 멀티스레드 인터페이스인 Thread에 관해 알아볼 것이다. C+11 thread를 사용하기 위해선 thread 헤더파일을 추가하는 것으로 시작할 수 있다.#include   이전 게시글에서도 언급했지만, 스레드는 프로세스를 처리되는 독립적인 실행 단위이다.이때 이 실행 단위를 콜러블 유닛, Callable Unit(호출 가능한 유닛)이라고 한다.  콜러블 유닛은 함수처럼 동작하는 개체들을 이라면 모두 해당이 된다. C++ 함수를 시작으로, 람다, 클래스 객체 또한 콜러블 유닛이 될 수 있다. 자, 그렇다면 이제 스레드를 생성해서 직접 한 번 사용해보자.#include #include using namespace std;void Task(){ cout   다음 코드를 ..

Modern C++ 2024.07.16