CMake를 사용해보자 CMake를 들어보았는가? CMake란 C/C++에서 사용되는 빌드 시스템이다. CMake를 사용하면 C++ 프로젝트를 더 쉽게 관리할 수 있게 된다. 그런데 우선, CMake를 알아보기 전에 make에 대해서 먼저 알아보자. make란? C++ 파일을 실행시키기 위해서는 어떻게 해야 하는가? 만약 C++를 처음 배운다면, Visual Studio를 실행시키고, 새로운 프로젝트를 생성해서, ctrl + shift + b 로 빌드하여 실행을 했을 것이다. 그러나 그 과정이 어떻게 이루어지는 지 알고 있는지 궁금해본 적 있는가? 간단히만 설명하자면, C++ 파일을 실행하기 위해서는 컴파일, 빌드, 링크 등의 과정이 필요하다. 컴파일은 CPP 파일을 읽고 기계어로 변환하는 과정이다. 이..
C++은 프로그래머가 직접 메모리를 관리할 수 있어, 매우 저수준의 영역까지 다룰 수 있는 언어이다. 그런만큼 C++ 프로그래머들은 컴퓨터 메모리의 구조를 잘 알고 있어야 한다. 특히 Heap memory, Stack Memory, Static Memory는 잘 알아야 한다. 또한 메모리 관리를 실패한다면, 병렬 처리를 할 때 False Sharing (두 개 이상의 스레드가 같은 블록 영역의 메모리에 접근하면서, 캐시 성능 저하가 발생하는 현상) 이 일어나 성능이 더 떨어지거나, 혹은 Data Racing (두 개 이상의 스레드가 동시에 같은 메모리에 대해 쓰기 접근하면서, 잘못된 연산을 하거나 서로 데이터에 대한 소유권을 주장하면서 성능이 저하되는 현상) 이 발생하기도 쉽다. 무엇이 됐든 C++을 할..
constexpr이란 constexpr은 C++11부터 지원되기 시작한 컴파일 상수이다. 11부터 시작해서 23에 이르기까지 constexpr은 그 지원 범위를 점차 늘려왔고, 많은 C++ 프로그래머로부터 각광을 받았다고 한다. 이 constexpr은 무엇이고, const와 무엇이 다른 것일까. constexpr, 혹은 컴파일 상수는, '컴파일 시간에 값을 결정하는 상수'라는 의미를 갖고 있다. 2, 3.0과 같은 상수를 생각해보자. 이 상수들은 런타임 도중 그 값이 변경되지 않는다. C 시절 #define NUMBER 5와 같이 작성하면, 이는 매크로라 하여서, 컴파일러가 자동적으로 NUMBER를 5로 바꾸어준다. 이때 NUMBER는 컴파일 도중에 그 값이 결정되지, 런타임 도중에 값이 5로 결정되는 ..
vector와 list 중 무엇을 써야 할까? 결론부터 말하면 거의 대부분의 상황에서 그냥 std::vector를 쓰면 된다. 그 이유를 알면 더 좋다. std::vector와 std::list의 차이 C++에서는 배열로 사용할 수 있는 컨테이너를 여러 개 지원하는데, 그 중 가장 많이 쓰이는 것은 std::vector와 std::list가 있다. 두 개 다 역할은 비슷한 거 같은데, 그 내부 구현은 완전히 다르다. 먼저 std::vector는, 그 내부 구조가 연속적인(Sequential 타입) 배열 형태로 이루어져 있다. 실제 물리적인 메모리 구조 상으로 연속적인 구조이다. 위 그림 모델이 정확히 std::vector의 모습을 표현하고 있다. 반면에 std::list는, 내부가 불연속적인(Non-se..