목록게임프로그래밍/C++ (19)
bdfgdfg
std::function std::function은 호출할 수 있는 모든 것을 Callable이라 하며, C++에서는 ()를 붙여 호출할 수 있는 모든것으로 정의한다. 위 경우 함수만을 떠올릴 수 있지만, C++에서는 Callable의 방법은 다양하다. 1 2 3 4 5 6 7 8 9 10 11 12 struct FuncObject { int operator()(int a, int b) { return a + b; } }; int main() { FuncObject a; std::cout 람다도 가능. -> C 스타일의 함수 포인터의 경우에는 함수만 저장 가능했다. 1 2 3 4 5 FuncObject a; int (*ptrFunc)(int a, int b); ptrFunc = a(20, 30); // ..
std::atmoic atomic은 원자라는 의미를 가지며 원자적 연산(더 이상 쪼개질 수 없는 연산)을 진행한다. 원자적 연산은 처리하는 중간에 다른 스레드가 끼어들 여지를 주지 않으며 전부 처리하거나 or 아무것도 하지 못했다. 이 두 가지 상황만이 존재하는 연산. 즉 한번에 일어나는 연산. 이것은 싱글 쓰레드 환경에서는 중요치 않지만, 멀티 쓰레드 환경에서는 중요한 개념. -> 둘 이상의 스레드가 공유 자원에 접근할 때 발생할 수 있는 문제를 경쟁 상태(Race condition)이라 한다. -> 경쟁 상태는 mutex와 같은 상호 배제 객체로도 해결이 가능하지만, atomic연산을 통해서도 위의 문제를 방지할 수 있다. -> 경쟁 상태가 문제가 되는 이유는 운영체제의 콘텍스트 스위칭(Context..
shared_ptr(공유 포인터) 스마트 포인터 중 하나. 이름에서 알 수 있듯이 원시 포인터가 가리키는 객체가 단 하나만이 가능한 유니크포인터와는 달리 공유포인터는 여러개의 공유포인터가 하나의 객체를 가리킬 수 있으며 아무도 가리키지 않을 때 자동으로 바로 해제 된다. 더 자세히 설명하기전에 메모리 관리기법에 대해 조금 알고있어야한다. 1. 가비지 컬렉션(Garbage Collection, GC) - Java,C#등 2. 참조 카운팅(Reference Counting) Java나 C#에서 사용되는 가비지 컬렉션은 사용하지 않는 객체를 알아서 판단하여 메모리를 회수한다. 매주기마다 가비지 콜렉션의 루트를 확인하여 힙에 있는 메모리에 루트를 통해 접근할 수 있는지 판단하고 접근할 수 없다면 가비지(쓰레기)..
스마트 포인터(Smart Pointer) C++은 new키워드를 통해 메모리를 동적할당 하였다면 메모리 누수를 막기 위해 꼭 다 사용하고 나서 delete를 해주어야 한다. C++11에서는 이러한 동적할당에 대해 더이상 직접 delete를 호출하지 않더라도 포인터가 필요하지 않게 되었을 때 자동으로 delete를 직접 호출해주는 기능이 추가 되었다. 그것이 바로 스마트 포인터. 자동으로 delete를 해준다는게 다른 객체지향 언어의 가비지 컬렉션의 개념과는 거리가 멀다. 이유는 스마트 포인터는 필요가 없어진 순간에 바로 알아서 delete를 하기 때문. (자동으로 삭제를 한다는점에선 같음) 스마트 포인터의 종류 1. unique_ptr 2. shared_ptr 3. weak_ptr 먼저 유니크 포인터를 ..