본문 바로가기

C++

(31)
map 과 unordered_map 의 차이점. [1. 개요]std::map 은 이진 탐색 트리를 기반으로 한다.search 연산을 대상으로 로그의 시간복잡도를 갖는다.std::unorderd_map 은 해시 테이블을 기반으로 한다.key 에 대한 hash 함수가 잘 정의 된다면, search 연산을 대상으로 일반적으로 상수 시간의 시간 복잡도를 갖는다. 그러나 key 를 대상으로 iterate 시 차이점이 있는데,map 은 key 가 정렬 조건 상 앞서는 것 순서대로 조회 할 수 있지만,unordered_map 은 그렇지 않다. (그래서 unordered_map 인 듯.)또, 경우에 따라서, unordered_map 이 map 보다 더 많은 메모리를 사용 할 수 있다. [2. 예제]#include #include #include #include co..
정적 라이브러리 생성 및 링킹.. [1. 개요]g++ -v --help 를 통해서, 모든 옵션을 확인 할 수 있다.[2. 코드 구조]main.cppcalc\s1.cpps2.cpputil.hpp[3. 절차]calc 라이브러리를 빌드하도록 한다.main.cpp 컴파일 시 calc 라이브러리를 링킹 하도록 한다.A. 라이브러리 빌드cd calcg++ -c s1.cpp s2.cpp# 컴파일 및 어셈블까지 하고, 링킹은 하지 않는다.# *.cpp 로 해도 된다.ar rcus libcalc.a *.o# 각 object 파일을 명시해도 된다. (s1.o  s2.o ...) # 현재 디렉터리에 있는 모든 object (.o) 파일을 하나의 파일로 묶어준다.# 일반적으로, .a 파일은 static 라이브러리 파일을 의미한다.# 일반적으로 ,lib.a 형..
chrono 타이머 [1. 개요]C++ 애플리케이션 작성 시, 여러가지 타이머 관련 예제 정리[2. 예제]
set vs multiset [1. 개요]  [2. 예제]#include #include int main(){ std::set s; std::multiset ms; for (int i=1; i 출력1 1 1 2 1 2 3 1 3 4 1 4 5 1 5 6 1 6 7 1 7 8 1 8 9 1 9 10 1 10 1 2 3 4 5 6 7 8 9 10 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 10 10 10 10 10 10 10 10 10 10 =>
[정리 필요] std::async std::launch::deferred => 비동기 호출을 동일한 스레드에서 => 반환한 future 의 get() 을 호출 할 때 실행된다. std::launch::async => 비동기 호출을 다른 스레드에서 promise future std::async 호출 시, future 를 반환(적절히 템플릿 작성) promise 의 get 을 통해 future 를 반환 => 다른 스레드에서 promise 에 대해서 set_value 혹은 set_value_at_thread_exit() 등을 통해 future 에서 값을 얻도록 할 수 있다 wait_for 등을 사용하면 일정시간 동안만 기다릴 수 있다. => 현재 태스크의 상태 값등을 확인 할 수 있다. ==> future_status::deferred => ..
C++ 멀티 스레딩 - 메모리 모델 [1. 원자계] std::atomic_flag clear() => flag 값을 false 로 test_and_set() => flag 값을 true 로, 읽기와 쓰기 연산이 하나의 원자계 연산으로 수행 된다. 최초 생성 시, ATOMIC_FLAG_INIT 상수를 이용해 false 로 초기화 해야 한다. 잠김 없는 유일한 원자계 더 높은 수준의 스레드 추상화를 위한 빌딩 블록 std::atomic_flag 를 이용한 spinlock 구현 std::atomic
정적 라이브러리 빌드 [1. 개요] 여러개의 소스코드로 이루어진 라이브러리를 정적라이브러리로 빌드 후, main() 함수가 정의 된 소스코드와 같이 컴파일 하는 과정 정리한다. CMake 형태의 C++ 프로젝트의 경우 cmake => make 로 컴파일을 쉽게 할 수 있지만, 새로운 라이브러리를 테스트 해야 하는 경우, 별도의 cmake 를 작성하는 것이 다소 부담스러울 수 있다. 이 경우, gcc(혹은 g++) 와 ar 을 이용하여 라이브러리 빌드 후, main() 과 링킹하여 간단하게 테스트 프로그램을 만들 수 있다. [2. 기본 개념] 정적 라이브러리 빌드는 보통 아래 과정을 거친다. 소스코드에 대해서 object 파일 생성 object 파일을 하나의 archive 파일로 묶는다. 1번 과정에서 gcc (g++) 를 사..
CMake command 정리 2 add_subdirectory (source_dir, [binary_dir], ...) => CMakeLists.txt 가 있는 디렉터리 경로를 source_dir 에 명시하도록 한다. => fd
컴파일 링커 옵션 [1. 개요] g++ 로 컴파일 시, 링킹 시 유용한 옵션 정리 [2.1 예제] 스택 사이즈 변경 g++ -Wl,--stack,1677216 test.cpp 함수 호출 시, 이 함수 내 지역에 선언한 buf 의 크기가 꽤 큰 경우, 함수 호출 시, 바로 segmentation fault 가 발생할 수 있다. 함수 호출을 위해, 컴파일 시, 일정 크기의 스택에 모든 지역 변수를 저장 할 수 있어야 하는데, buf 크기가 이 크기를 벗어나서 문제가 된 것이다. 이 경우 디폴트 스택 크기를 꽤 크게 잡아주면 runtime 오류를 해결 할 수 있다. [2.2 예제] 외부 라이브러리 링킹 g++ main.cpp -lrdkafka++ -L"./" rdkafka 를 사용하는 c++ 코드 컴파일 시, rdfkafka ..
리눅스 CMake 설치 [1. 개요] centos:7 기준으로 cmake 설치 혹은 업데이트 방법 정리 [2. yum 을 이용한 설치] yum search cmake yum install -y cmake cmake --version yum 이용한 설치 시 cmake version 은 2.8.12.2 최신 버전의 cmake를 설치하려면 아래와 같은 단계를 수행] [3. cmake 최신 버전 설치] github cmake repository 에서 바이너리를 가져와 설치 wget https://github.com/Kitware/CMake/releases/download/v3.25.1/cmake-3.25.1-linux-x86_64.tar.gz tar -zxf cmake-3.25.1-linux-x86_64.tar.gz cd cmake-..