목록C++ (58)
Coding Memo
본 포스팅은 인프런에 등록되어 있는 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 변수는 컴파일 시 최적화를 진행하지 않기 때문에 매번 값을 읽고 쓰기 위해 메모리에 접근하는 과정을 포함한다. 이전 글에서는 크게 문제가 될만한 사항이 없는 예제들에 대해서 작성하였지만 이번 글에서는 쓰레드에서 치명적인 문제가 발생할 수 있는 예시들에 작성하였다. 컴파일 최적화에서 어떤 변수에 대해 이 변수가 다른 쓰레드에서 사용을 하..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 변수를 선언 할 때, 타입 앞에 volatile을 붙여서 선언할 수 있다. volatile 변수는 C/C++ 만 아니라 Java 등의 다른언어에도 있는 개념이다. volatile 키워드가 붙은 변수는 컴파일러가 코드를 최적화 하는 과정에서 해당 변수에 대한 최적화를 하지 않도록 한다. 즉, 컴파일 과정에서 최적화에서 제외되어 프로그램 실행 시에 매번 값을 확인하러 메모리에 접근하도록 한다. 아래 코드를 실행 시킨다고 하자. int main() { int a = 0; a = 1; a = 2; a = 3; cout
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의에서 언급된 내용과 제 생각을 함께 정리한 글입니다. 미리 컴파일 된 헤더 파일 사용 Pre-Complied Header: 포함된 헤더 파일을 미리 컴파일 하여 미리 파일로 저장시켜놓기 때문에, 매번 해당 헤더를 실행이나 빌드시 마다 매번 처음부터 컴파일을 하지 않아도 된다. 즉, 프로젝트가 커지면 커질수록 미리 컴파일 된 헤더 파일을 사용하면 디버그나 테스트를 좀 더 빨리 할 수 있다. 장점: 실행 시 마다 매번 헤더파일을 파싱하지 않아도 되기 때문에 컴파일 시간을 줄일 수 있다. 단점: 해당 헤더 파일의 내용을 바꾸면 변경 후 처음 컴파일 시간이 길어질 수 있다. (무거워 질 수 있다.) 사용 방법은 간단하다. 1. 프로젝트 우클릭 - 속성 ..
Painting Fence https://codeforces.com/problemset/problem/448/C Problem - 448C - Codeforces codeforces.com Problem HTML 삽입 미리보기할 수 없는 소스 Input HTML 삽입 미리보기할 수 없는 소스 Output Print a single integer — the minimum number of strokes needed to paint the whole fence. Examples 더보기 Input 5 2 2 1 2 1 Output 3 Input 2 2 2 Output 2 Input 1 5 Output 1 문제 해석 울타리를 세우고 페인트를 칠했을 때 스토로크를 사용하는 횟수의 최솟값를 구하는 문제이다. 페인트..