목록전체 글 (162)
Coding Memo
본 포스팅은 인프런에 등록되어 있는 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..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. C++ 에서도 C11 부터 자체적으로 std에 lock을 지원해주고 있다. 기본적인 lock 기능만 사용할 경우 불편한 점이 몇가지 있다. 1. 표준 mutex로는 재귀적인 lock을 잡을 수 없다. (recursive_mutex가 있긴하다) 2. 메모리를 동시에 쓰거나 읽을 때는 반드시 원자적으로 접근해야하지만, 읽기만 할때는 반드시 원자적으로 접근 할 필요가 없다. (-> 많은 쓰레드들이 동시에 어떤 값을 읽기만 하는 것은 lock이 필요하지 않을 수 있다.) 따라서 위와 같은 불편한 점과 편의를 위해 직접 구현하기도 한다. 구현 핵심 lock을 가지고 있는 쓰레드들을 구분하기 위해 32bit 사용 상위 1..
이전 글: https://minttea25.tistory.com/68 volatile 변수 본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 변수를 선언 할 때, 타입 앞에 volatile을 붙여서 선언할 수 있다. volatile 변수는 C/C++ 만 아니라 Java 등의 minttea25.tistory.com volatile 변수는 컴파일 시 최적화를 진행하지 않기 때문에 매번 값을 읽고 쓰기 위해 메모리에 접근하는 과정을 포함한다. 이전 글에서는 크게 문제가 될만한 사항이 없는 예제들에 대해서 작성하였지만 이번 글에서는 쓰레드에서 치명적인 문제가 발생할 수 있는 예시들에 작성하였다. 컴파일 최적화에서 어떤 변수에 대해 이 변수가 다른 쓰레드에서 사용을 하..
보호되어 있는 글입니다.