목록분류 전체보기 (157)
Coding Memo
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 소켓을 이용해서 간단하게 서버와 클라이언트 접속을 해보도록 하자. 소켓 프로그래밍을 위해서는 다음과 같은 라이브러리와 헤더가 추가되어야 한다. (아래 문서에도 나와있다.) (https://learn.microsoft.com/ko-kr/windows/win32/winsock/creating-a-basic-winsock-application) #include #include #include #pragma comment(lib, "ws2_32.lib") MS에서 제공하는 윈도우 소켓을 이용한다. 자세한 문서는 아래에 있다. https://learn.microsoft.com/ko-kr/windows/win32/wins..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 다음과 같은 클래스가 있다고 가정해보자. class Player { public: Player() {} virtual ~Player() {} }; class Knight : public Player { public: Knight() { } }; class Mage : public Player { public: Mage() { } }; class Archer : public Archer { public: Archer() {} }; 상위 클래스인 Player로 관리를 해줄 것인데, 중간중간 관리 리스트에 있는 Knight와 Mage를 사용하고 싶을 때가 있을 것이다. 그럴때, 다음과 같이 캐스팅을 통해 객체를 가져..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 동일한 클래스를 모아서 관리하는 Object Pool을 구현 메모리 풀과 비슷한 방식으로 작동한다. 그러나 메모리 크기에 따라 공간을 나누었던 메모리 풀과 다르게 타입 하나에 하나의 풀을 할당하여 사용할 것이다. 메모리 관련 오류가 발생했을 때 어떤 클래스에서 오류가 난 것인지 알 수 있는 장점이 있다. Object Pool private 맴버로 할당 크기와 타입별 사용할 메모리 풀을 static으로 선언한다. template class ObjectPool { public: static Type* Pop(Args&&... args) {} static void Push(Type* obj) {} private: s..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. Memory Pooling 메모리 공간을 특정 크기를 가진 여러 공간으로 나누어 미리 할당을 해 놓고 어떤 타입을 생성하거나 소멸시에 이 미리 할당된 공간을 활용하는 방법이다. 단순히 new/delete를 할때마다 kernel 레벨로 가서 직접 메모리 할당/해제를 요청하면 성능 저하가 일어날 수 있고, 메모리 단편화 (메모리가 해제되어 사용가능한 공간이 남아있는데도 불구하고 남은 공간이 연속적이지 않아 메모리 할당을 할 수 없는 문제)을 초래할 수 있다. 따라서 사용되지 않는 메모리 공간이 계속 할당되고 있는 상태이므로 메모리 할당/해제가 빈번히 일어날 경우에 사용하면 좋다. Stomp Allocator and..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. STL에 있는 많은 Containers 들은 선언할 때 추가적으로 allocator를 따로 지정해줄 수 있다. 이 allocator을 사용자 정의하여 각 container들의 메모리 사용하는 정책을 지정해 줄 수 있는 것이다. 예를 들어 vector 같은 경우 다음과 같은 생성자가 구현이 되어 있다. template class vector ... 그렇다면 이 allocator에는 어떤 타입이 들어가야 할까? main 함수에서 다음의 코드를 실행해 본다면 무엇이 필요한지 대강 알 수 있다. (BaseAllocator는 전에 작성했던 클래스 이다.) int main() { vector v; } 실행하면 오류가 쭉 ..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 작성한 글입니다. 기존 Allocator에서 발생될 수 있는 문제 (에러조차 안뜰 수 있는 치명적인 문제들!) 첫 번째 문제 int main() { vector v{ 0, 1, 2, 3, 4 }; for (int i = 0; i < 5; i++) { int value = v[i]; if (value == 1) { v.clear(); } } } value==1 일때 vector를 clear하고 v[i]로 접근하려고 하면 문제가 발생한다. 이 문제는 런타임에러가 바로 발생하여 바로 문제를 찾을 수 있다. (vector에 의해서) 두 번째 문제 class Unit { public: Unit() { } Unit(int hp) : _hp..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 작성한 글입니다. C#, Java 등은 메모리관리를 알아서 해주지만 C++은 직접 해야할 필요가 있다. (new-delete) new-delete를 그대로 사용하지 않고 오버로딩 하듯이 바꿔서 사용하여 메모리를 할당(allocate)하고 해제(free)를 한다. 그 이유는 1. new를 할 때마다 메모리 할당을 커널에 요청하기 위해 컨텍스트 스위칭(context switching)이 빈번하게 일어날 수 있다. -> 성능 저하 발생 가능성 2. 사이즈가 각각 다른 할당된 메모리들에서 몇몇 부분이 해제되었을 경우, 사용할 수 있는 빈공간이 생기는데 메모리 구조상 이어저 있지 않은 경우 비어 있는 메모리 공간 이상의 사이즈를 가진 메..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 작성한 글입니다. 아래 코드를 살펴보자 #pragma once #include #include using namespace std; class A { public: int v = 10; }; class B { public: B() {} void SetRef(A* a) { _ref = a; } void DoSomethingWithRef() { _ref->v += 1; } private: A* _ref = nullptr; }; int main() { A* a = new A(); B* b = new B(); b->SetRef(a); // 어떤 이유로 A가 소멸됨 delete a; while (true) { if (b) { b->DoS..