Home
-
[C++] 가비지 컬렉션과 참조 카운트에 대해 알아보자 | 메모리 관리 자동화
프로그래밍 언어엔 메모리를 프로그래머가 직접 관리해주는 unmanaged 언어와 언어단에서 관리해주는 managed 언어가 있다. 대표적인 예로 C/C++가 unmanaged 언어이며 C#, Java가 managed 언어이다. 대부분의 매니지드 언어에선 자동으로 메모리 관리를 하기 위해 다음 중 하나의 기법을 사용한다. (해당 포스팅에선 스마트 포인터를 다루기 위한 사전 지식을 위해 간단한 개념만 정리합니다.) Garbage collection (가비지 컬렉션 또는 쓰레기 수집) Reference counting (레퍼런스 카운팅 또는 참조 횟수) [Garbage collection] 가비지 컬렉션을 한국말로 굳이 번역하면 쓰레기 수집인데, 사용되지 않는 메모리를 언어단에서 수집하여 지운다는 의미로 보면..
2019.12.30
-
[C++] 스택과 힙 메모리, "RAII"라는 패턴 및 기법에 대해 알아보자
RAII가 스마트 포인터와 연관이 있어 해당 카테고리에 작성한다. 먼저 지역 변수와 매개변수가 저장되는 스택 메모리에 대해 알아보자. 스택 메모리 (Stack memory) 스택은 지역 변수와 매개변수가 저장되는 공간이며 예약된 지역 메모리 공간이다. 예약된 메모리라는 말은 동적 할당처럼 사용자의 입력 N에 따라 할당하려는 크기가 변하는 것이 아니라 int arr[10]과 같이 컴파일 타임에 그 크기가 미리 정해지는 메모리란 뜻이다. 예약된 메모리 공간이기 때문에 동적으로 할당하는 힙 메모리와 달리 메모리 할당과 해제에 대한 오버헤드가 없다. 스택은 데이터를 저장할 때 스택의 경계를 넘어 다른 영역이 침범되는 것을 막기 위해 한계치(가장 높은 주소)부터 거꾸로 저장한다. 즉 스택의 top은 스택 메모리 ..
2020.02.23
-
[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.03.15
-
[C++] 포인터와 레퍼런스(참조)의 차이를 이해해보자
C++에는 포인터(Pointer)와 레퍼런스(Reference)라는 개념이 있다. 포인터는 C 에도 있었던 개념이며 레퍼런스는 C++ 에서 등장한 개념이다. 언뜻 보면 용도가 비슷한데 정확히 어떤 차이점이 있는지, 내부적으로 어떻게 동작하는지, 왜 레퍼런스가 나오게 됐는지에 대해서 정리해보자. 포인터에 대해 헷갈려 하시는 분들을 위해 간단하게 용어 정리를 해보자면.. 포인터는 변수의 주소를 저장하는 특별한 타입의 변수이다. 주소값 자체를 포인터라고 생각해도 좋다. 주소만을 저장할 수 있는 변수를 포인터 변수라고 하고 일반적인 변수 선언과는 다르게 자료형에 * 표시를 붙여 선언한다. int* p; 는 int형 변수의 주소를 저장하는 포인터 (변수) p를 선언한 것이다. 포인터, 포인터 변수 다 같은 말이다..
2019.12.05
-
[C++] 가상 함수와 가상 소멸자에 대해 알아보자(feat. 가상테이블) | virtual
가상 함수와 가상 소멸자는 상속 관계에서 사용되는 용어이며, 멤버 함수에 virtual 키워드가 붙은 함수를 말한다. 이는 C++에서 OOP의 중요한 특징 중 하나인 다형성(Polymorphism)을 지원하기 위한 기능 중 하나이다. C++의 멤버 함수는 기본적으로 컴파일 타임에 호출할 클래스의 형이 결정된다.(정적 바인딩) virtual 키워드는 호출 대상을 컴파일 타임이 아닌 런타임에 판단하여 해당 포인터가 가리키는 오브젝트의 실제 클래스 타입을 찾아 그 클래스의 함수를 동적으로 호출할 수 있게 해준다. 참고로 자바에선 모든 멤버 함수가 가상 함수이다. 따라서 상위 클래스의 함수를 재정의하면 알아서 하위 클래스의 함수가 호출된다. 예를 들어, 아래와 같이 상위 클래스의 포인터 변수 pBase에 하위 ..
2019.12.10
-
[C++] 클래스의 멤버가 저장되는 영역 및 메모리 차지
클래스 사용 도중 헷갈리던 내용이 있어서 정리함. 함수 내에서 임시로 객체를 생성할 때 사용 용도에 따라 비효율적인 부분이 있는지 헷갈려서 instance 생성 시 각 멤버들이 어떻게 메모리를 차지하는지 개념을 정리하기 위한 글. 우선 class는 멤버 변수와 멤버 함수를 가질 수 있고 각각 정적(static)과 비정적(non-static) 멤버 변수, 함수를 가질 수 있다. 먼저 클래스 타입의 객체 또는 인스턴스 자체의 크기는 비정적 멤버 변수만 영향을 미친다. 즉 멤버 변수로 int형 변수 1개를 가지면 이 클래스의 instance의 sizeof는 4바이트, 2개를 가지면 8바이트 이런 식. 비정적 멤버 변수는 객체의 생성과 동시에 생성된다. 객체 내의 지역 변수와 동일하므로 스택에 저장된다. (물론..
2020.01.10
-
[C++] 복사 생성자 및 할당(=) 연산자가 호출되는 시점 | 초기화와 할당의 차이 | RVO(Return Value Optimization)
먼저 초기화(Initializeinitialization)와 할당(Assignment)의 차이부터 살펴보자. 초기화는 객체의 생성과 동시에 초기 값을 설정해주는 것을 말한다. 흔히들 변수 선언만 해놓고 다른 곳에서 값을 할당하는 것을 초기화라고 하는 사람도 있는데, 엄밀히 말하면 이것은 초기화가 아니라 할당이다. 그 이유는, 일단 객체 선언 시 값을 대입을 하지 않으면 객체의 타입에 맞게 알아서 기본 초기화가 된다. 객체가 int, double과 같은 기본 타입(non-class)일 경우는 초기에 값을 할당하지 않을 경우 기본 초기화가 되며, c++에선 기본 타입에 기본 초기화 시 정의되지 않은 쓰레기 값을 갖는다. 반면 string과 같은 class 타입의 객체는 타입에 알맞게 기본 생성자를 호출하여 ..
2020.02.07
-
[C++] 추상 클래스와 순수 가상함수를 알아보자(feat. 인터페이스, 다중상속)
추상 클래스 추상 클래스란 순수 가상함수를 1개 이상 가지고 있는 클래스를 말한다. 순수 가상함수란, 구현되지 않은 가상함수를 말한다. 구현되지 않은 가상함수란, 상위 클래스에서 정의는 하지 않고 선언만 해놓은 가상함수를 말한다. 순수 가상함수는 다음과 같이 표시한다. 가상 함수에 0을 대입하여 해당 클래스에선 구현하지 않겠다라는 의미를 부여한다. virtual void PureVirtualFunction() const = 0; // 순수 가상함수 가상 함수를 모른다면 https://woo-dev.tistory.com/50 첫 번째 클래스는 추상 클래스이며 두 번째 클래스는 추상 클래스가 아니다. 1. class FirstClass { public: ... void SampleFunction() cons..
2020.02.20
-
[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.03.21
-
[C++] 스마트 포인터에 대해 알아보자(2) | 공유 포인터 | std::shared_ptr
유니크 포인터와 참조 카운팅에 대해 모른다면 다음 포스팅을 보고오는 걸 추천한다. 참조 카운팅 https://woo-dev.tistory.com/61 유니크 포인터 https://woo-dev.tistory.com/110 [유니크 포인터의 단점] 먼저 저번에 다루었던 유니크 포인터는 원시 포인터에 대한 소유권을 다른 유니크 포인터와 공유할 수 없었다. 즉 복사 생성과 복사 대입 연산이 불가능하여, 공유를 허용하지 않았다. 이러한 원칙들로 인해 유니크 포인터는 사용자가 메모리 관리에 대해 실수할 여지를 막아주었다. 하지만 함수에 인자로 포인터를 넘겨야 할 경우 get을 통해 원시 포인터를 반환하는 방식으로 넘겨야 했다. 그러나 이는 외부에서 마음대로 지워버릴 수 있기 때문에 위험했으며, 원시 포인터를 반환..
2020.03.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.03.19
-
[C/C++] malloc과 new의 차이와 동작 원리
개인적으로 학습용으로 작성하는 내용이라 틀린 부분이 있을 수 있습니다. [malloc 함수와 new 연산자] 우선 표면적인 가장 큰 차이는 malloc은 함수고 new는 연산자(operator)라는 것이다. malloc 함수는 바이트 단위의 Size를 인자로 받아 사용 가능한 메모리 공간의 시작 주소를 반환해준다. 물론 malloc은 메모리 공간의 요소들을 자동으로 초기화해주지 않는다. 기본적으로 쓰레기 값을 가진 메모리 주소를 반환한다. 특정 값으로 초기화를 원한다면 calloc 함수를 사용할 수 있다. 만약 Size로 들어온 크기만큼 할당할 수 없다면 NULL을 반환한다. malloc은 오로지 POD(Plain Old Data) 타입에 대해서만 크기를 할당해줄 수 있다. POD 타입이란 쉽게 말해 연..
2020.04.07
-
[C/C++] realloc 함수 사용 시 주의할 점
[realloc] realloc 함수는 malloc을 통해 할당된 메모리의 크기를 축소하거나 확장하고 싶을 때 사용한다. [realloc 사용 시 주의사항] void* realloc(void* ptr, size_t size); 1. realloc은 ptr이 가리키는 메모리 주소의 크기를 size 바이트로 확장 또는 축소한다. 만약 size바이트 만큼 연속된 메모리를 할당할 수 없을 경우 새로운 영역을 할당 후 기존 요소들을 복사하여 새 메모리 주소를 반환한다. 따라서 항상 ptr이 이전의 주소값과 일치한다고 말할 수 없다. 2. realloc은 size가 0이거나 size바이트만큼 할당할 수 없다면 ptr은 그대로 살려둔채로 NULL을 반환한다. 보통 realloc을 다음과 같이 사용하는데, 이 경우 기..
2020.04.09
-
[OS] 운영체제의 구조와 역할을 간단하게 알아보자
개인적으로 학습하는 내용이라 틀린 내용이 있을 수 있습니다. 참고 도서 [개념 이해를 위한 운영체제] [운영체제란?] 운영체제(Operating System, OS)를 딱 한 문장으로 표현하긴 어렵다. 관점에 따라 다를 수 있으며 기능도 여러 가지이기 때문이다. 일단 운영체제는 일종의 시스템이다. 시스템은 "어떤 주어진 목적을 달성하기 위해 여러 개의 구성 요소들이 유기적으로 결합된 집합체" 를 의미한다. 운영체제의 목적은 두 가지 관점에서 설명할 수 있다. 하나는 사용자의 입장, 하나는 시스템(컴퓨터)의 입장. 사실 우리가 평소에 컴퓨터를 사용하면서 컴퓨터의 입장에서 운영체제를 생각해본 적은 대부분 없을 것이다. 하지만 컴퓨터를 배우기 위해선 컴퓨터의 입장에서 생각해야 한다. 예를 들어 키보드 또는 마..
2019.11.27
-
네트워크 프로그래밍을 위한 TCP/IP와 OSI 7 layer
개인적으로 공부하는 내용이라 틀린 내용이 있을 수 있습니다. 참고 https://www.youtube.com/watch?v=laBzCcF1414&list=PLXvgR_grOs1BjBZiePPZMR1PmZybazxg6&index=2 https://www.joinc.co.kr/w/Site/Network_Programing/Documents/IntroTCPIP [TCP/IP란?] TCP/IP란 TCP와 IP라는 두 프로토콜을 함께 가리키는 말이다. TCP와 IP라는 개념을 이해하려면 먼저 프로토콜이 무엇인지 알아야 한다. 프로토콜(Protocol)이란 컴퓨터(호스트)와 같은 통신 장비들이 서로 메세지를 주고받기 위한 통신 규약이다. 이렇게만 말하면 개념이 너무 추상적이라 잘 와 닿지 않는다. 프로토콜은 인터페..
2020.04.25
-
mov와 lea 명령어 / call by value, call by reference, call by address 쉽게 이해하기
MOV EAX, EBP LEA EDX, EBP mov (move) 명령어는 좌변에 우변(상수 가능)의 값을 복사합니다. lea (load effective address) 명령어는 좌변(레지스터)에 우변의 주소값을 저장합니다. 사용 예시) mov eax, ecx 라는 명령은 ecx 레지스터에 저장된 값을 eax 레지스터에 복사한다는 의미입니다. mov eax, [adr] 라는 명령은 adr 주소가 가리키는 값을 eax 레지스터에 저장한다는 의미입니다. mov eax, dword ptr [num] 라는 명령은 num의 주소가 가리키는 4바이트(dword) 값이 eax에 저장된다는 의미입니다. mov dword ptr [num], 12345 지역변수 num에 12345라는 상수 값을 복사(저장)합니다. mo..
2019.12.05
-
[c++] Visual studio 2019 환경에서 디버깅 하기 / debugging, memory, disassemble, 디버그, 디버거
안녕하세요. 오늘은 VS2019 환경에서 디버깅 기능을 사용하는 방법에 대해 알아보겠습니다. 디버깅이란 프로그램 작성 중 발생한 에러를 찾고 고치는 과정을 말합니다. 개발자가 오류를 잡는데 도움을 주도록 보통 개발 툴마다 디버깅 기능을 지원하는데, 그중에서도 비쥬얼 스튜디오는 디버깅 기능이 뛰어나기로 유명합니다. 한 단계 한 단계 따라가며 VS의 디버깅 기능을 이용하다 보면 신기하기도 하고 한번 익혀두시면 많은 도움이 될 거라 생각합니다. 알아볼 것 기본적인 디버깅 방법 디버깅 중 메모리 영역 확인 (특정 주소에 어떤 값이 들었는지 눈으로 확인) 디버깅 중 고급언어로 작성된 소스코드를 저급 언어인 어셈블리어로 변환하여 보는 방법 (Disassemble) 목차 1. 중단점 체크 2. 디버깅 시작 2-1) ..
2019.10.15
-
포큐 아카데미 - COMP 3200 수강 후기 | C++
과장되거나 허위적인 내용 없이 작성했다는 것을 먼저 밝힙니다. [포큐 아카데미란?] 포큐 아카데미는 렌더링 엔지니어이자 전 BCIT 대학 교수인 "김포프" 가 설립한 비인가 교육 기관이다. 주로 CS 기초를 위주로 가리키며 모든 과목을 포프님이 담당하신다. 해당 교육 기관의 목표는 모두를 위한 강의가 아닌, 정말 프로그래머를 자신의 업으로 삼고 10년 뒤에도 당당히 살아남을 수 있고 대체될 수 없는 프로그래머를 양성하는 것이 목표이다. 다음은 포큐 아카데미 사이트에 소개된 글을 인용한 내용이다. 유능한 소프트웨어 엔지니어 및 설계자이자, 유수 공사립 대학의 교수였던 김포프가 창립한 POCU는 탑 프로그래머가 평생 커리어를 유지하려면 반드시 알아야 하는 컴퓨터 공학 수업을 제공하는 온라인 우선 교육 서비스..
2020.04.25