본문 바로가기
728x90

Programing_Language25

스마트 포인터 스마트 포인터 new와 delete 키워드를 사용 하지 않고 사용이 끝난 포인터를 메모리에서 자동으로 해제 해주는 클래스 템플릿 메모리 누수로부터 안전성을 보장하기 위함 스마트 포인터 종류 unique_ptr shared_ptr weak_ptr (TODO) 정리 예정 c++11 이후로 auto_ptr은 사라짐. 스마트 포인터는 헤더에 정의 되어있음 unique_ptr 특정 객체를 하나의 포인터만 소유 할 수 있도록 소유권 개념의 포인터 다른 포인터와 객체 핸들링을 공유할 수 없기 때문 lvalue 시멘틱이 적용 되지 않는다. ex) ptr1 = ptr2 (ptr1 과 ptr2 는 unique_ptr) 다른 포인터로 객체 참조를 이동시키기 위해 move(이동)시멘틱을 사용한다. ptr1 = std::mov.. 2020. 12. 21.
c++ 함수 포인터 C와 C++의 함수포인터 C에서의 함수포인터 타입 재정의 함수 역시 주소를 가지고 있기 때문 포인터와 마찬가지로 함수를 가리키는 포인터를 만들 수 있다. //짝수인지 반환 함수 bool isEven(const int& number) { return (number % 2) ? false : true; } //함수포인터 타입 재정의 typedef bool(*check_func)(const int&); //배열의 짝수들 출력 void printEvenNumber(const array& my_arr, check_func = isEven) { for (const auto &e : my_arr) { if (isEven(e)) cout 2020. 12. 16.
assert (단언하기) in C++ assert assert 는 Debug 모드에 실행된다. 디버깅시 컴파일러의 도움을 받을 수 있다. static_assert는 컴파일 타임에 적용된다. assert 는 런타임에 적용된다. 반대로 assert 키워드는 Release 모드에서는 실행이 안된다. assert 변수 체크할때 사용 할 수 있다. 런타임에 적용 #include using namespace std; int main(void) { int a = 1; a+=9; /*... 많은 과정을 생략중...*/ assert(a==10) //이 과정이 끝나면 a는 반드시 10 이어야 한다고 가정 // 만약 19번 행에서 a가 10이 아닌 다른 수면 // debug모드에서 에러가 나면서 콘솔로 출력이됨. // return 0; } static_asse.. 2020. 12. 15.
템플릿(Template) (2/2) (템플릿 특수화) 템플릿 매개변수 일반적으로 클래스 템플릿을 작성할 때는 template 처럼 꺽쇠괄호 안에 매개변수를 나열한다. 이 매개 변수 T뿐만 아니라, 함수의 매개변수처럼 원하는 수 만큼 지정할 수 있다. 이때, 매개변수를 타입 대신 디폴트 값으로 정해도 된다. template //템플릿의 타입을 2개로 m_array의 size를 받는다. class ClassArr { private: T m_array[size]; public: T* getArray() { return m_array; } T& operator[](int index) { return m_array[index]; } void print() { for (int count = 0; count < size; ++count) cout 상속 특정한 타입에 대.. 2020. 12. 14.
템플릿(Template) (1/2) 템플릿(template) C++에서 언어 차원에서 객체지향 프로그래밍 뿐만 아니라 제네릭 프로그래밍(generic programming)도 지원한다. 제네릭 프로그래밍은 데이터를 중요시하는 객체지향적 프로그래밍 철학보단 알고리즘에 그 중점을 두었다. 템플릿(template)은 데이터 타입(data type)이 아닌 매개변수의 타입에 따라 클래스를 생성하는 클래스 템플릿 과 메서드 템플릿, C++14 이후 부터는 변수 템플릿 이 있다. 또한 템플릿은 템플릿 특수화라 하여 범위에 따라 다르게 템플릿을 적용시키는 템플릿 특수화 라는 개념이 있다. 함수 템플릿 특수화 클래스 템프릿 특수화 포인터에 대한 특수화 템플릿에 의한 형변환은 컴파일 타임에 결정된다. 즉 사람이 타입을 맞춰줄 필요없이 컴파일러에게 타입 결.. 2020. 12. 13.
2차원 동적 배열 할당과 해제 (배열 vs 벡터) 벡터를 애용하자 2차원 vector 선언 vector v2; //2차원벡터 선언 vector v1 //1차원 벡터 선언 v1.push_back(2); v1.push_back(20); v1.push_back(337); //v2[0][0] == 2, v2[0][1] == 20, v2[0][2] == 337 v2.push_back(v1); 2차원 vector 초기화 //5x10 0으로 초기화시키기 (10열의 각 원소가 0인 배열을 5줄(행) 만든다.) vector v(5, vector(10,0)); //5x5 순환 접근 2차원 배열과 똑같다. for(int i=0; i 2020. 12. 7.
enum과 enum class (열거 타입과 엄격한 열거 타입) enum (열거형) enum 타입 내부 멤버들에게 정수(int)값으로 이름을 붙일 때 사용한다. 주로 내부 멤버이름을 대문자로 이름 짓는경우가 많다. 각 열거자들의 값은 이전 열거자 값에 +1이 증가 된 값으로 알아서 할당된다. ex) enum days {Sunday = 1 , Monday, Friday=10, Wednesday}; Monday == 2 (True) , Wednesday == 11 (True) 만약 enum 타입의 첫 번째 멤버에 값을 생략하면 컴파일러가 알아서 0부터 대입 해준다. 실제 메모리를 잡아먹지 않는다. 단 열거자가 할당된 변수에 대해 메모리가 할당됨. 그럼 열거형을 쓰면 좋은점은? 왜 써요? 위험한 상황(의도하지 않게 타입의 값이 변경되어 다르게 동작 하는 상황들)을 피할 수.. 2020. 12. 6.
[쓰레드 동기화] Interrupt(이벤트) 방식의 AutoResetEvent 스핀 락(Spin lock)처럼 폴링 방식의 스레드 대기는 CPU 점유율이 올라갈 수 있다. 무한정 대기상태라는 말은 계속 잠금이 풀릴때까지 확인하는 방법이다. 스레드가 무한정 대기하는 부담을 줄일 수 있는 방법이 있다. 하지만, 이것은 커널단의 호출로 문맥교환의 오버헤드가 발생된다. 더보기 마이크로 프로세서에서의 단일코어 단일 프로세스 예를 들어보면, 폴링 방식으로 어떠한 값의 state 변화를 감시하고 계속 대기 시켜놓으면 그 일만 하며 무한정 대기한다. 하지만, 내부 혹은 외부인터럽트를 사용하면, 코드를 한줄 한줄 실행 중간에 들어온 인터럽트를 확인하고, 현재 작업을 중단 시킨다. 작업을 중단시키는 것은 아얘 작업을 비우는 것이아닌 레지스터와 내부 메모리의 어떤 지점에 현재 작업정보와 다음 작업해야.. 2020. 7. 21.
[쓰레드 동기화] Thread [Sleep, Yield] , ContextSwitching 랜덤(Random) 접근 스레드가 while 루프내에서 스핀 락 처럼 무한정 대기하며 불필요한 작업을 하는 것이아닌 랜덤적으로 접근하여 해장 잠금(locked)을 사용하는 방법이다. 여기서 랜덤적으로 접근이란, 한 가지 예시적 상황을 보자. 처음 들어온 스레드가 임계구역에 들어가서 어떤 변수를 사용중인 상황에 두번째 스레드가 임계구역에 들어 가려고 잠금을 획득하려는 찰나 누군가 사용하고 있다. 스핀 락의 경우 폴링방식으로 무한정 대기하지만, 이 랜덤 접근의 상황에서는 두번째 스레드가 "아 누군가 쓰고있네 잠시 있다 와야지 난 좀 이따가 올게 "의 방법이다. 이 방법을 사용하면 불필요한 연산이나 작업을 줄여 CPU의 점유율을 낮출 수 있지만, 반대로, "잠시 있다 와야지" 라는 상황이 무한정 발생한다면, .. 2020. 7. 21.
[쓰레드 동기화]스핀 락(Spin Lock) 구현 스핀 락 스핀락은 폴링 방식의 동기화 처리를 하는 방식이다. 마이크로 프로세서 에서 내부 인터럽트를 사용하지 않고 값의 state 가 바뀌는지 while(1) 을 이용하여 확인 하는것과 같다. 한 가지 예를 보자 num 이라는 데이터를 첫번째 스레드에선 +1 씩 계속 증가시키고 두번째 스레드에선 -1 씩 계속 감소시키는 행위를 각각 10만번 씩 하면 직관적으로는 당연히 프로그램이 뻗지 않는이상 당연히 0이 나올 것이다. 하지만 이전 포스팅에서 자원 접근에 대한 동기화가 이루어 지지 않으면 한 쪽에서 값을 변경 시켜도 다른 쪽에선 이전에 가지고 있던값을 최신이라고 저장하고 있다가 값을 변경시키는 현상이 발생하므로 의도했던 데이터 갱신이 이루어지지 않는다. 이를 해결하기 위해 첫번째 폴링 방식의 스핀락을 구.. 2020. 7. 20.
728x90