공부 114

메모리 풀(Memory Pool)

학부생때 들어보기만한 메모리풀을 직접 구현해봤다. 듣기만 해서 대충 개념만 알고 있어서 직접 구현하려니 어디서부터 시작해야할지 몰랐다. 그래서 구체적으로 메모리 풀이 어떤건지 개념을 다시 정리하는 것 부터 시작했다. 위키피디아에선 메모리 풀은 고정된 크기의 블록을 할당하여 malloc이나 C++의 new 연산자와 유사한 메모리 동적 할당을 가능하게 해준다. memory pool은 불리는 동일한 사이즈의 메모리 블록들을 미리 할당해 놓는다. 그러면 응용 프로그램들은 실행 시간에 핸들에 의해서 표현되는 블록들을 할당하고, 접근하고, 해제할 수 있다. 이 말을 조금 나의 방식대로 풀어서 설명하면, 거대한 덩어리의 메모리 블록을 미리 할당해놓고, 이것을 사용자가 원하는 만큼 조금씩 떼어서 준다는 것이다. 왜 사..

공부/그 외 2021.07.14

C++ 11 enum class

C++ 11부터는 enum class라는 syntax를 지원한다. 이 enum class는 기존의 enum의 문제점을 보완하고자 나온 syntax이다. enum은 사용자 정의 타입임에도 정수형과 호환이 가능하다. 예를 들어서 enum Color { RED, GREEN, BLUE }; int main() { int rgb = RED; } 또한 enum은 정의하면 enum내에서가 아닌 enum이 포함된 스코프 내에서 정의되기 때문에 같은 스코프 내에서 서로 다른 enum 블록에서 정의한다고 하더라도 이름이 겹치면 재정의된 것으로 보고 오류가 난다. 예를 들어서 int main() { enum Color { RED, BLUE, GREEN, // duplicated! }; enum Color2 { GREEN, ..

공부/C || C++ 2021.07.10

char*를 cout으로 출력할 경우 주소가 올바르게 나오지 않는 경우

reinterpret_cast를 이용해서 int*를 char*로 cast해서 주솟값을 std::cout을 이용해서 확인해보니 주솟값이 출력이 안되는 경우가 있었다. 처음엔 reinterpret_cast에 대해서 내가 잘 모르는게 있는줄 알고 열심히 찾아봤는데 그게 아니고 헤더 중에서도 출력과 관련 있는 에 대해 내가 모르는게 있었다. C++에서 을 이용해서 아래 코드처럼 char*의 주솟값을 출력하려고 하면 아무것도 출력되지 않는다. int memory[10]{ 1,2,3,4,5,6,7,8,9,10 }; int main() { int* p = memory; char* c = reinterpret_cast(p); cout

공부/C || C++ 2021.07.09

Handle, Handler란?

객체지향언어인 C++로 프로그래밍을 하다보면 handle, handler란 용어나 클래스들을 접하기도 한다. 사전적 의미는 손잡이 정도로 해석되는데 프로그래밍할때 정확히 어떤 의미이고, 그냥 '특정 기능을 하기 위해 필요한 도구'정도로 이해하고 지나쳤는데 이번 기회에 조금 더 자세히 알아보자. event handler를 생각해보면 어떤 특정 event(ex. interrupt)마다 handler가 존재하며, 그 event가 일어나면 해당 handler가 호출되고 handler안에서 event를 처리해주는 진짜 함수를 호출한다. 내가 참고한 블로거분이 찾은 영어로된 설명을 적자면 A handler is a routine/function/method which is specialized in a certai..

공부/그 외 2021.07.09

레거시(legacy)란?

원래 legacy는 사전적 의미로(물려 받)유산이라는 뜻이 있는데 IT에서도 legacy라는 용어가 쓰인다. IT에서 legacy란 사전적 의미와 비슷하기 정보기술에서, 레거시 프로그램과 데이터는 프로그래밍 언어, 플랫폼 그리고 기술 등에 있어, 과거로 부터 물려 내려온 것들을 의미한다. 컴퓨터를 사용하는 대부분의 기업들은 중요한 업무를 처리하는 레거시 응용프로그램들과 데이터베이스를 가지고 있다. 예를 들어서 회사에서 visual studio 2015를 쓰고 있는데 visual studio 2019가 새로 나와서 코드를 visual studio 2019에 맞게 버전업 시켜야 할 때 visual studio 2015를 legacy라고 부른다. Reference https://arabiannight.tist..

공부/그 외 2021.07.08

C++ 전처리기(preprocessor)

전처리기란 컴파일 전에 실행되는 코드로써 #으로 시작한다. 종류로는 include, Macro 그리고 조건부 컴파일(Conditional compilation)이 있다. 1. include 다들 알다시피 컴파일러와 함께 제공되는 헤더파일은 를 이용해서 포함시키고, 따로 사용자가 작성한 헤더파일은 소스코드가 있는 경로 기준으로 해서 ""를 이용해서 포함시킨다. 예를 들어서 아래와 같다. #include // 컴파일러에서 제공되는 헤더파일 #include "MemoryBlock.h" // 사용자 정의 헤더파일 2. Macro Macro에는 #define을 이용해서 만들고 종류는 객체와 유사한 매크로와 함수와 유사한 매크로가 있다. 객체와 유사한 매크로는 다시 대체 텍스트가 있는 것과 없는 것으로 나뉘는데 예..

공부/C || C++ 2021.07.08

C+ 11 스마트 포인터(unique_ptr, shared_ptr, weak_ptr)

C++는 JAVA와 달리 가비지 컬렉터가 없기 때문에 new로 메모리 할당을 하고 사용이 끝나면 사용자가 반드시 delete로 해제해줘야 한다. 하지만 스마트 포인터는 포인터처럼 동작하는 클래스 템플릿으로써, 할당 후 메모리 해제를 해주지 않아도 자동으로 해제해주는 기능을 가진 녀석이다. 더 정확하게 이야기하면 스마트 포인터라는 클래스 템플릿의 소멸자에는 사용한 자원을 해제해주는 코드가 포함되어 있다고 한다. 이러면 자연스럽게 메모리 할당 후 해제를 해주지 않아서 생기는 memory leak도 어느 정도 해결될 것이라고 생각한다. 신기하게 new로 할당한 메모리도 스마트 포인터에 대입하면 나중에 해제해주지 않아도 된다고 한다. 스마트 포인터에는 unique_ptr, shared_ptr, weak_ptr ..

공부/C || C++ 2021.07.07

C++ 오버로딩(overloading) vs 오버라이딩(overriding), 가상함수(virtual function) 그리고 다형성(polymorphism)

C++을 공부한 사람이라면 누구나 한번쯤은 헷갈려 봤을 법한 오버로딩과 오버라이딩에 대해 정리해보자. 우선 오버로딩은 매우 간단하다. 함수 파라미터 타입이나 갯수만 다르게해서 다른 함수로 인식하도록 하는 것이다. 그 말은 함수의 리턴 타입만 다르게 해서는 오버로딩이 아니라는 의미이다. 예를 들어서 이렇게 리턴 타입만 다르고 함수 파라미터의 갯수와 타입이 같으면 오버로딩이 안된다는 것이다. 오버라이딩은 상속 관계에서 부모의 기능을 자식이 상속받을 때, 자식이 부모의 기능을 재정의하는 것을 의미한다. 예를 들어서 class person { public: void foo() { cout

공부/C || C++ 2021.07.05