본문 바로가기

C++

(34)
Segmentation fault 상황 사례 [1. 개요]아래 세그멘테이션 폴트 사례는 오염 된 포인터 변수에 접근 시 발생함.엄밀하게 말하면 스택 오버플로우가 아니기 때문임.[2. 예제]#include #define MAX_LEN 5struct A { int arr[MAX_LEN]; int len;};class MyContainer {private: // 메모리 배치를 고려하면... A first; const int *bptr; const char *cptr; const float *dptr;public: MyContainer() { first.len = 0; bptr = new int[MAX_LEN]; cptr = new char[MAX_LEN]; dp..
gdb 사용 방법 (기초) [1. 개요]리눅스 C++ application 디버깅 시, 유용한 툴 인 gdb 의 기초적인 사용 방법을 정리한다. 기본적으로 breakpoint 를 걸고, 한줄 단위로 실행해보기 위해서 디버깅 심볼들이 필요하다.따라서, CMake 기준에서는최적화를 많이 하는 Release 빌드 보다는 Debug 빌드가 적합하다.아래와 같이, gdb 실행 시 심볼들을 찾을 수 없다는 메시지가 출력 된다. g++ 로 직접 빌드하는 경우라면, -g 옵션을 사용하고, 최적화는 하지 않도록 한다.[2. 기본적인 실행] 1 #include 2 3 int sum(const int a, const int b) 4 { 5 const int aa = a*a; 6 ..
erase 계열 함수... [1. 개요]STL 컬렉션 들의 멤버 함수 erase() 의 리턴 값의 의미하는 바가 무엇인가?erase 의 입력으로 사용 된, 반복자의 다음위치를 가리키는 iterator 가 반환된다.[2. 예제]#include #include #include #include #include std::vector vec;std::list lst;std::map kv;std::unordered_set uos;void print_vec(){ std::cout "; auto itr1 = vec.erase(itr0); std::cout "; auto itr1 = lst.erase(itr0); std::cout first second "; auto itr1 = kv.erase(itr0); ..
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++) 를 사..