분류 전체보기
C++ 참조 대상 수 (Reference Counting)
Reference Counting은 객체의 소유권 관리( = 라이프 사이클 )의 방법 중 하나로 객체를 참조(포인팅) 하고 있는 횟수를 추적하여 그 횟수가 0이 되면 메모리에서 해제(소멸)한다. 대부분의 Managed Language (python, c#, swift등 메모리 관리를 직접 하지 않는 언어 ) 에서 널리 사용되고 있다. 장점 - 메모리를 직접 해제하는 번거로움이 사라진다. - 객체의 소유권을 공유할 수 있다 - 객체 관리 매커니즘이 비교적 단순해서 빠르다. (Garbage Collection) 단점 - 순환 참조 문제가 있다. c++ 에서의 구현방식에는 크게 두가지가 있다. Intrusive Reference Counting (침습성 참조 카운팅) - 객체에 대한 참조 카운트가 "내장" 되..
C++ 순환 참조 (Circular Dependency) & 데드락
순환 참조 문제는 비단 Reference Counting 뿐만이 아니라 다양한 영역에서 이를 피하는것이 매우 중요하다. 설계적 관점에서, 서로 참조를 하는 두 객체가 있다면 의존 관계가 양방향이 되고 의존성(Dependency)이 커지기 때문에 코드 관리에 어려움이 생긴다. 멀티 스레드( or 프로세스 ) 환경에서는 Resource를 점유한 상태로 새 Resource의 요청이 "순환"하는 경우 교착 상태(Dead Lock)에 빠지게 된다. class ObjectA { public: ObjectA() { std::cout
Thread 사용법 및 생성
thread 생성 방법 1) C 스타일 thread 생성 (함수 포인트 활용) thread(thread로 돌릴 함수, 넘길 인자); 2) Class의 Static 함수를 사용한 Thread 생성 thread(Class명:thread로 돌릴 함수, 넘길 인자); 3) Class의 멤버 함수를 사용한 Thread 생성 thread(Class명:thread로 돌릴 함수, Class 생성자, 넘길 인자); 4) lambda 를 사용한 Class 멤버 함수 Thread 생성 static이 아닌 클래스의 멤버함수를 Thread로 돌릴 수 있다. 5) lambda 를 사용한 Thread 생성 thread로 돌릴 내용을 바로 생성 한다. #include #include using namespace std; /* * 함..
데드락 (Deadlock) 의미 & 조건
데드락(Deadlock)이란? 멀티 프로그래밍 또는 멀티 스레드 환경에서는 여러 프로세스 또는 스레드가 한정된 자원을 동시에 사용하기 위해 항상 경쟁 상태에 놓여 있고 프로세스가 필요한 자원을 획득하지 못하고 영원히 자원을 기다리는 상태이다. 시스템 모델 설명 자원이란 CPU, 파일, 메모리, 락객체(세마포어나 뮤텍스 같은 Synchronize Object) 등등 컴퓨터 시스템에서 여러분이 사용할 수 있는 모든 것들을 총칭하는 추상적인 용어다. 요청(Request) : 프로세스가 특정 자원을 시스템에게 요청하면 시스템은 현재 이 자원이 사용 가능하다면 프로세스에게 할당 한다. 불가능하다면 자원이 사용 가능해 질 때까지 기다린다(Wait state). 사용(Use) : 자원에 대한 허가가 떨어지면 프로세스..
멀티 스레드 (Multi Thread) 소스코드
병렬처리 기법중 하나로 cpu안에 있는 여러개의 코어를 이용해서 더욱더 빠른 연산을 하게하는 기법이다. #include #include #include #include using namespace std; // 임계 영역 mutex mtx; //mutual exclusion int main() { // 여러가지 일을 동시에 처리 // cout이 깨지지않게 실행시키기 위해서 // mutex를 이용해 cout을 lock시키고 다 실행되면 // unlock하는 식으로 이용한다. auto work_func = [](const string& name) { for (int i = 0; i < 5; i++) { this_thread::sleep_for(chrono::milliseconds(100)); mtx.lock..
C++ 4가지 타입의 캐스팅
1. static_cast C언어의 타입 캐스팅과 동일하다. 논리적으로 변환 가능한 타입만 변환한다. 안에는 타입을 지정하고, ()안에는 캐스팅할 대상을 지정한다. 업캐스팅 다운캐스팅 참고 2. const_cast 변수, 포인터 변수 또는 참조형의 상수성을 추가 / 제거를 위한 캐스팅에만 사용. class Parent { int mVal = 0; public: Parent() = default; Parent(int Val) : mVal(Val) { } public: void Print() { cout
C# 클래스 타입 업/다운 캐스팅 (Up-DownCasting)
업캐스팅 부모 클래스 객체를 자식 클래스 객체로 변환. 인스턴스화 또는 자식 클래스 객체 할당하는 방법이 존재. 다운캐스팅 자식 클래스 객체를 부모 클래스로 객체로 변환. 오직 부모 클래스 객체로부터 할당만 가능. using System; using System.Collections.Generic; using System.Runtime.InteropServices; public class Parent { public virtual void Print() { Console.WriteLine("Parent 클래스"); } } public class Child : Parent { public override void Print() { Console.WriteLine("Child 클래스"); } } public..
C++ 클래스 타입 업/다운 캐스팅 (Up-DownCasting)
업캐스팅 클래스 객체를 기반 클래스로 변환하는것. 부모형으로 자식 클래스의 메소드에 접근 가능한 경우 추상메소드를 자식클래스에서 정의한 경우 부모클래스에 정의된 메소드를 자식에서 오버라이딩한 경우 class Parent { public: virtual void Print() { cout
C++ 명시적 형변환/캐스팅 (explicit)
명시적 형변환 int intVal = 2; float floatVal = (float)intVal; float floatVal = float(intVal); 아래와 같은 차이가 존재한다. int first = 5; int second = 2; float floatVal = first / second; float floatVal2 = (float) first / second; std::cout
C++ 상수식 (constexpr)
constexpr은 const처럼 변수에 적용 할 수 있으며 해당 변수에 대한 변경을 시도하면 컴파일러는 에러를 발생한다. const와는 다르게 생성자에 적용 할 수 있다. constexpr로 지정된 값이나 리턴 값이 상수이며 컴파일 타임에 계산된다. 템플릿 인수 및 배열 선언 같은 const 정수 값이 사용되는 곳에 constexpr 정수 값이 사용 될 수 있다. 컴파일 타임에 값이 계산되면 프로그램 실행 속도가 빨라지며 메모리 사용량이 줄어든다. constexpr 리턴 값 constexpr 함수의 리턴 값이 constexpr 속성을 가지려면 리터럴 타입이어야 한다. const int64_t const_mypow(int64_t itarget, int isquare) { if (isquare