본문 바로가기

C,C++/C++51

[C++] 스마트 포인터에 대해 알아보자(3) | 약한 포인터 | std::weak_ptr 공유 포인터와 참조 카운팅에 대해 모른다면 다음 포스팅을 보고 오는 걸 추천한다. 참조 카운팅 https://woo-dev.tistory.com/61 공유 포인터 https://woo-dev.tistory.com/111 weak_ptr는 unique_ptr이나 shared_ptr 와는 다르게 단독으로 혼자 사용할 수 있는 포인터가 아니다. 다음은 weak_ptr 이 무엇인지 이해하기 위해 알아야 하는 것들이다. [강한 참조] 먼저 공유 포인터는 참조 카운팅을 사용하여 현재 소유하고 있는 원시 포인터가 참조되는 횟수를 추적한다는 것을 기억해야 한다. 또한 참조의 종류엔 강한 참조(strong reference)와 약한 참조(weak reference)가 있고, 아직까진 약한 참조가 무엇인지 모르지만 공유 .. 2020. 3. 21.
[C++] 스마트 포인터에 대해 알아보자(2) | 공유 포인터 | std::shared_ptr 유니크 포인터와 참조 카운팅에 대해 모른다면 다음 포스팅을 보고오는 걸 추천한다. 참조 카운팅 https://woo-dev.tistory.com/61 유니크 포인터 https://woo-dev.tistory.com/110 [유니크 포인터의 단점] 먼저 저번에 다루었던 유니크 포인터는 원시 포인터에 대한 소유권을 다른 유니크 포인터와 공유할 수 없었다. 즉 복사 생성과 복사 대입 연산이 불가능하여, 공유를 허용하지 않았다. 이러한 원칙들로 인해 유니크 포인터는 사용자가 메모리 관리에 대해 실수할 여지를 막아주었다. 하지만 함수에 인자로 포인터를 넘겨야 할 경우 get을 통해 원시 포인터를 반환하는 방식으로 넘겨야 했다. 그러나 이는 외부에서 마음대로 지워버릴 수 있기 때문에 위험했으며, 원시 포인터를 반환.. 2020. 3. 21.
[C++] 스마트 포인터에 대해 알아보자(1) | 유니크 포인터 | std::unique_ptr C++ 11에 특별한 포인터 클래스가 포함되었다. 스마트 포인터라고 불리며 포인터 사용 시 사용자의 실수에 의한 메모리 누수(memory leak)를 방지하고 안전한 사용을 위해 나온 3가지 클래스가 등장하였다. std::unique_ptr std::shared_ptr std::weak_ptr 해당 포스팅에선 유니크 포인터 먼저 다루기로 한다. 혹시 RAII 또는 스택의 개념에 대해 모른다면 다음 포스팅을 한번 보고 오는걸 추천한다. https://woo-dev.tistory.com/89?category=882879 [C++] 스택과 힙 메모리, "RAII"라는 패턴 및 기법에 대해 알아보자 RAII가 C++ 11의 스마트 포인터와 연관이 있어 해당 카테고리에 작성한다. 먼저 지역 변수와 매개변수가 저장.. 2020. 3. 19.
[C++] 해시맵(Hashmap)을 이해해보자 | std::unordered_map | 기술면접 해당 포스팅은 unordered_map 클래스 자체보단 해시맵/해시테이블에 대한 내용을 다룹니다. [기존의 STL std::map] C++ 11 이전의 기존 STL 컨테이너인 std::map은 요소가 자동으로 오름 차순으로 정렬되는 이진 탐색 트리(BST) 기반의 map이였다. 정확히 말하면 Red-black-tree 라는 스스로 균형을 맞추는 이진 탐색 트리의 일종이다. 여기서 주목해야 하는 것은 오름 차순이 아니라 정렬이 자동으로 된다는 것이다. 기존 map은 정렬이 필요하지 않은 경우에도 자동으로 되었기 때문에 불필요하게 감수해야 하는 오버헤드가 있었다. [C++ 11의 std::unordered_map] C++ 11 이전엔 정렬이 필요하지 않은 경우에도 std::map을 사용하여 불필요한 오버헤드.. 2020. 3. 15.
[C++] 범위 내의 난수 생성하기 | 비결정적 난수 비결정적 난수 생성 [개요] C++ 11 이전엔 C 스타일의 rand() 함수를 이용하여 난수를 생성하였다. C++ 11부턴 C++ 스타일의 난수 생성 함수가 나왔으며 헤더 파일에 정의되어 있다. C 스타일의 난수 생성에 비해 난수의 형, 범위 등을 세세하게 조절할 수 있으며 기능적으로 많이 향상되었다. 난수 생성 방법에는 동일한 난수표를 사용하여 첫 실행 이후부터는 예측이 되는 방법과 매번 달라지는 난수 생성 방법이 있다. 여기선 매번 달라지는 비결정적 난수 생성 방법을 다룬다. 이 방법은 실제로 하드웨어 노이즈나 마우스 움직임 등을 통해 예측할 수 없는 난수 생성을 위한 리소스를 만들어 사용한다. [헤더 및 클래스 소개] 이라는 헤더 안에 난수 생성기와 난수 분포기 관련 클래스가 들어있다. 난수 생성.. 2020. 3. 5.
[C++] 멤버 변수의 오프셋을 계산해주는 offsetof 매크로 #define offsetof(type, member) [매개 변수] type: 구조체 또는 클래스의 이름 member: 멤버 변수 이름 [반환값] type 내의 member의 offset을 계산하여 반환한다. C++ 17 미만은 type으로 오직 standard layout type 대해서만 그 기능이 정의되어있다. standard layout type이란 오직 C 스타일의 데이터로만 이루어진 데이터 구조 타입을 말한다. 예를 들면 기본 타입 int, float, double, char 등, 함수가 포함되지 않은 구조체가 그 예이다. C++ 17부턴 함수가 포함된 클래스의 멤버 변수의 오프셋도 계산할 수 있다. [예제] class Foo { public: Foo() = default; ~Foo() = .. 2020. 2. 29.