개발/C·C++
-
sleep_for(), yield()개발/C·C++ 2021. 9. 1. 16:43
를 인클루드하면 사용할 수 있는 sleep_for()과 yield()는 같은 듯 다릅니다. sleep_for() 함수를 호출한 스레드는 괄호 안의 시간만큼 스레드가 블락(block)됩니다. 블락이 끝나면 해당 스레드는 준비 큐에 들어가서 CPU 스케줄링에 의해 선택되기를 기다려야 합니다. yield() 함수는 해당 스레드가 블락되지 않고 해당 스레드에 할당된 CPU를 커널에 양도할 수 있도록 사용하는 OS에 힌트를 줍니다. 스레드가 바로 준비 상태가 된다고 볼 수 있죠. 그러므로 yield()는 sleep_for(0ms)와 동일하게 기능합니다. 하지만 굳이 인자를 넘겨야 하는 함수보다는 yield()를 호출하는 게 낫지 않을까 싶습니다. >>출처 https://en.cppreference.com/w/cp..
-
비주얼 스튜디오에서 다른 프로젝트의 파일 참조하기개발/C·C++ 2021. 8. 31. 22:17
다른 프로젝트의 헤더 파일 사용하기 A 프로젝트에서 B 프로젝트의 C.h를 마치 자신의 프로젝트에 있는 것처럼 인클루드해서 사용할 수 있습니다. A 프로젝트의 속성에서 [VC++ 디렉터리]를 가보면 포함 디렉터리를 설정할 수 있는데 B 프로젝트의 폴더를 지정하면 됩니다. 정확히는 C.h가 있는 폴더를 지정하면 됩니다. 다른 프로젝트 라이브러리 참조하기 여러가지 방법이 있습니다. 그 중 하나입니다. 라이브러리 프로젝트는 프로젝트를 만들 때 동적 라이브러리 혹은 정적 라이브러리 둘 중에 하나를 정해서 생성합니다. 정적 라이브러리 기준입니다. A 프로젝트에서 D 프로젝트(정적 라이브러리 프로젝트)를 컴파일해서 얻은 lib 파일이 있는 폴더를 [VC++ 디렉터리]의 라이브러리 디렉터리에 추가해주면 됩니다. 여기..
-
[Rvalue reference] Forcing Move Semantics(4)개발/C·C++ 2021. 8. 26. 20:15
>> 번역글입니다 >> 의역은 있고 오역이 있을 수 있습니다 >> 출처 http://thbecker.net/articles/rvalue_references/section_04.html C++ 표준의 수정 조항 1조는 "위원회는 C++ 개발자가 자신의 발에 총 쏘는 것을 금지하는 규칙을 만들지 않을 것이다"라고 명시되어 있습니다. 농담을 조금 빼고 말하면, 개발자에게 제어를 더 주는 것과 그들을 부주의에서 지켜주는 것을 논할 때, C++은 제어를 더 제공하는 실수를 범하는 경향이 있습니다. 그 정신에 입각해, C++11은 당신이 rvalue뿐만 아니라, 재량에 따라서 lvalue에도 이동 의미론을 사용할 수 있습니다. 한 가지 좋은 예가 std 라이브러리의 swap 함수입니다. 이전과 마찬가지로, rval..
-
생각보다 자주 보이는 생성자개발/C·C++ 2021. 8. 4. 22:46
임시 객체는 시스템에 부담을 주는 존재입니다. C++에서 이동 의미론이나 rvalue reference 같은 개념을 도입한 이유이기도 할 겁니다. copy elison(복사 생략)처럼 임시 객체를 이용해서 초기화가 이루어지는 경우, 직접 초기화하는 것처럼 컴파일러가 최적화를 해주는 것도 같은 맥락일 것입니다. copy elison을 이용할 수 있는 환경이 아니라면 이동 의미론을 활용하는 편이 좋다고 생각합니다. 간단한 예제 몇 가지를 들어보겠습니다. 다음과 Person 클래스가 있습니다. class Person { public: Person(int data) :_data(data) { cout
-
[알고리즘] Quick sort개발/C·C++ 2021. 8. 3. 16:17
종류 분할-정복 알고리즘입니다. 분할-정복 알고리즘은 재귀적으로 자신을 호출하면서 연산 단위를 조금씩 줄여나가는 방법입니다. 재귀 호출이 한 번 진행될 때마다 최소 하나의 원소는 위치가 정해지기 때문에 이 알고리즘은 반드시 끝난다는 것을 보장할 수 있습니다. 장점 재귀호출의 과정에서 임시 메모리를 쓰는 것은 성능 저하를 가져오기 때문에(리턴값을 사용하지 않음) 배열 내부에서 분할 작업을 구현하는 편이 좋습니다. 퀵 정렬은 메모리 참조가 지역화되어 있기 때문에(캐시의 공간 지역성) 캐시 히트률이 높습니다. 이런 이유로 일반적인 경우 퀵 정렬은 다른 O(nlogn) 알고리즘보다 빠르게 작동합니다. 기본 흐름 피벗을 기준으로 왼쪽에는 피벗보다 작은 원소를, 오른쪽에는 피벗보다 큰 원소들을 위치합니다. 개념적으..
-
[자료구조] doubly linked list개발/C·C++ 2021. 8. 2. 19:51
오류가 있을 수 있습니다. 멀티스레드 환경이 고려되지 않았습니다. 템플릿을 사용하지 않았고 int형 데이터만 저장합니다. 표준 라이브러리(std::list)의 멤버 함수를 일부 참고했습니다. DDL.h #pragma once class DDL { private: struct Node { int data; Node* prev; Node* next; public: Node(int data) :data(data) { prev = nullptr; next = nullptr; } }; private: int _size = 0; Node* _head = nullptr; Node* _tail = nullptr; public: DDL() = default; ~DDL(); void push_front(int data);..
-
[overloading] operator <<개발/C·C++ 2021. 7. 28. 14:17
참고 C++ draft 연산자 오버로딩에 적용되는 규칙이 있습니다. 규칙과 관련해서 예제 몇 개를 작성해보겠습니다. Expression @a as member function #include class Position { private: int x; int y; public: Position() = default; Position(int x, int y) :x(x), y(y) {} Position operator-() const { return Position{ -x, -y }; } void print() const { std::cout