728x90
반응형

C++ 161

[C++] std::bind 시 변수 메모리 유지 불가

function을 구성할 때 운용하기 쉽도록 하기 위해 bind를 이용하여 매개변수를 미리 넣어둘 수 있다. 하지만 이 방향은 하나의 패키지처럼 묶기기 때문인지 변수의 메모리 주소가 변경되었다. 아래와 같이 간단히 테스트해보면 bind로 묶은 변수 b와 실제 함수에 적용되는 b의 주소 값이 다르다. 결과도 적용되지 않는다. #include #include using namespace std; void add(int a, int& b) { b = a * a; cout

[C++] 변수 묶어 사용하기 (pair, tuple)

함수를 이용할 때 연관된 내용을 동일한 개수만큼 전달하거나 관리해야 할 때 묶어서 사용하곤 한다. 자주 사용되는 경우라면 struct나 class를 이용하여 작업을 할 수도 있지만 임의로 묶어 사용할 때에는 비효율적이다. 이런 점을 해결하기 위해서 C++에서는 pair와 tuple을 지원한다. pair : 2개의 값을 묶고 싶을 때, tuple : 3개의 값을 묶고 싶을 때, pair의 경우에는 웬만한 STL 헤드 파일을 첨부하면 사용할 수 있지만 tuple의 경우에는 을 include 해줘야 한다. pair의 경우에는 make_pair를 tuple은 make_tuple을 사용하면 된다. pair는 first, second를 참조하면 되고, tuple은 get을 이용해야 한다. #include #incl..

[C++] file in/out

C++에서 파일 관련하여 제공하는 Stream 클래스는 다음과 같다. ofstream : 파일에 쓰는 기능의 Stream class ifstream : 파일을 읽는 기능의 Stream class fstream : 파일에 대한 읽고 쓰는 기능을 모두 갖춘 Stream class wifstream : 유니코드 문자로 쓰인 텍스트 파일을 읽는 Stream class wofstream : 유니코드 문자를 텍스트 파일에 쓰는 Stream class #include #include using namespace std; int main() { setlocale(LC_ALL, ""); ofstream fout; fout.open("D:\\sample.txt"); fout

[C++] XMLLite를 이용한 XML 파일 읽어오기

XML을 읽어오는 방법에는 여러 방법이 있다. 직접 코딩할 수도 있고, tinyXML 같은 오픈 api를 사용해도 된다. 여기서는 Visual Studio에서 제공하는 XMLLite를 이용하여 읽어 오도록 해보자. 우선 XML의 ELEMENT를 저장할 수 있는 구조체를 지정한 후 typedef struct XML_ATTRIBUTE_T { wstring name; wstring value; } XMLATTR; typedef vector XMLATTRV; typedef struct XML_ELEMENT_T { wstring title; XMLATTRV attribute; bool bSubElement; bool bSeperator; vector vElem; XML_ELEMENT_T() { bSubElemen..

코드/C++ 2021.11.08

[자료구조] 버블 정렬

버블 정렬이란? 매우 기본적인 정렬 알고리즘인 버블 정렬(Bubble sort)은 이해하기 쉽기 때문에 단순 정렬(simple sort)이라 불린다. 다만 빠르다고 알려진 정렬 알고리즘보다는 비효율적이다. 버블 정렬은 다음과 같은 단계를 따른다. 1. 배열 내에서 연속된 두 항목을 가리킨다. 첫 번째 항목과 두 번째 항목을 비교한다. 2. 두 항목의 순서가 뒤바뀌어 있으면 (왼쪽 값이 오른쪽 값보다 크면) 두 항목을 교환(swap)한다. 순서가 올바르다면 아무것도 하지 않는다. 3. 비교 위치(포인터)를 오른쪽으로 한 셀씩 옮긴다. 4. 더 이상 교환하지 않을 때까지 1단계부터 3단계까지 반복한다. 더는 교환을 하지 않는다는 것은 배열이 정될된 상태라는 뜻이며 1 ~ 3 단계를 반복하는 것을 패스스루(p..

[C++] RAII Pattern

C++ 에는 RAII (Resource Acquisition Is Initialization)이라는 패턴이 있다. 리소스의 획득은 초기화다라는 뜻인데 보통 RAII Design Pattern이라고 한다. 예를 들자면, lock_gaurd class가 있다. class lock_guard {// class with destructor that unlocks mutexes public: explicit lock_guard(_Mutexes&... _Mtxes) : _MyMutexes(_Mtxes...) {// construct and lock _STD lock(_Mtxes...); } lock_guard(_Mutexes&... _Mtxes, adopt_lock_t) : _MyMutexes(_Mtxes...) ..

[C++] std::thread 종료 (abort() has been called)

std::thread를 사용하다 보면 abort() has been called라는 에러 메시지를 만나는 경우가 있다. 이는 thread가 종료되기 전에 시스템이 종료되거나, 객체가 사라질 때 발생한다. 이 때는 join()을 사용해서 해결하면 된다. #include #include using namespace std; int total; void sum() { for (int i = 0; i < 200000; i++) total += 1; } int main() { while (1) { total = 0; std::thread th1(sum); std::thread th2(sum); cout

[C++] 스마트 포인터

스마트 포인터는 에 정의되어 있고, RAII 또는 리소스 획득 초기화 프로그래밍 관용구에 매우 중요하다. 스마터 포인터의 목표는 개체의 모든 자원 생성이 한 줄의 코드에서 만들어지고 준비되어 그 개체가 초기화되는 동시에 자원 수집이 발생하는 것을 확인하는 것이다. 이전 포인터 선원과 비교하면 아래와 같다. void UseRawPointer() { Song* pSong = new Song(L"Nothing on You", L"Bruno Mars"); // Use pSong delete pSong; } void UseSmartPointer() { unique_ptr song2(new Song(L"Nothing on You", L"Bruno Mars")); // Use song2 // delete automa..

[C++] emplace_back

std::vector에서 push_back 함수는 '객체'를 집어넣는 형식으로 객체가 없이 삽입하려면 '임시 객체'가 있어야 한다. #include #include #include using namespace std; struct item_t { item_t() : aa("default"), vv(0) {} item_t(string a, int v) { aa = a; vv = v; } string aa; int vv; }; int main() { vector items; item_t item = {}; // 기본 생성자 items.push_back(item_t("abc", 3)); items.push_back(std::move(item)); cout

[C++] 윈도우즈에서 텍스트로 함수 호출

남겨진 코드를 쫓다 보니 함수형 프로그래밍의 초입까지 도착한 것 같다. 우선 가장 간단하게 함수 이름으로 함수를 실행시키는 코드가 필요했다. 이런저런 복잡한 코드가 많았는데 Windows와 gcc를 사용하는 os와의 차이는 조금 있는 것 같다. 나는 우선 windows를 사용하니 #include typedef void(&u_func)(char*); void hello(char* name) { printf("hello %s !!\n", name); } int main() { HMODULE module = GetModuleHandle(NULL); FARPROC proc = GetProcAddress(module, "hello"); hello("Tom"); return 0; } 이렇게 간단하게 구현해 봤다. ..

error C2558 : no copy constructor available or copy constructor is declared 'explicit'

클래스나 구조체를 vector의 push_back을 이용하여 넣으려고 하니 C2558 에러가 발생한다. 생성자에서 복사가 불가능하거나 복사 생성자에 explicit이 선언되어 있다는 것이다. 여기저기 검색하다 보니 const를 선언하지 않아서 발생한 에러였다. typedef struct PSOPACK_T { PSOPACK_T(PSOPACK_T& other) { func = move(other.func); } } typedef struct PSOPACK_T { PSOPACK_T(const PSOPACK_T& other) { func = move(other.func); } }

[C++] std::async

std::async는 std::task 클래스 기반으로 만들어진 클래스로 thread를 만들 때 사용한다. std::async는 std::thread와 달리 내부적으로 thread pool을 만들어 thread를 관리하며 std::thread보다 안정적이며 프로그래머가 사용하기 편하다. std::async는 반환 값을 std::future로 받는다. #include #include using namespace std; void print(char id) { for (int i = 0; i < 10; i++) { printf("thread no : %c , Count : %d \n", id, i); } } int main() { std::future a = std::async(std::launch::asy..

[C++] values

C에서의 Rvalue, Lvalue는 좌측 값은 대입(assignment) 시에 왼쪽 혹은 오른쪽에 오는 식(expression)이고, 우측 값은 대입 시에 오직 오른쪽에만 오는 식이다.라고 정의하고 있지만 C++에서는 다음과 같이 정의하고 있다. 좌측 값은 어떠한 메모리 위치를 가리키는데, & 연산자를 통해 그 위치를 참조할 수 있다. 우측 값은 좌측 값이 아닌 값들이다. C++11부터는 prvalue, xvalue, glvalue가 추가되었다. C++11에서는 이러한 value들을 다음과 같이 나누었다. lvalue : identity를 가지면서 move 될 수 없는 표현식 xvalue : identity를 가지면서 move 될 수 있는 표현식 prvalue : identity를 가지지 않고 있으면서..

[C++] std::move

template constexpr typename std::remove_reference::type&& move(T&& t) noexcept; std::move는 C++11에 도입된 개념으로 t가 가지고 있는 자원을 다른 객체에게 효율적으로 전달하는 것을 의미한다. std::move는 이동을 수행하지는 않는다. 이동될 수 있음을 알려주는 역할만 한다. std::move 된 객체를 함수에 전달한다면, 우측 값 레퍼런스를 인자로 받는 함수 (이동 생성자, 이동 대입 연산자, push_back 등)가 오버 로딩되어서 선택된다. 참고로 우측 값 레퍼런스 자체는 lvalue이기 대문에, 이동 생성자나 이동 대입 연산자 내부에서 std::move를 호출하는 경우가 많다. // 이동 생성자 A(A&& arg) : m..

[C++] thread_local

thread_local은 thread가 TLS(Thread Local Storage)를 지원하기 위해서 C++11부터 추가되었다. 기존에 TLS변수를 선언하기 위해서는 __declspec(thread)를 사용해야만 했다. 하지만 정식으로 thread_local가 도입됨으로 간편하게 사용할 수 있게 되었다. TLS(Thread Local Storage) : thread 별로 고유한 저장공간을 가질 수 있는 방법이다. 각각의 thread는 고유한 Stack을 가지기 때문에 Stack 변수(지역 변수)는 thread별로 고유하다. 그래서 각각의 thread가 같은 함수를 실행한다고 해도 그 함수에서 정의된 지역 변수는 실제로 서로 다른 메모리 공간에 위치한다는 의미다. 그러나 정적 변수와 전역 변수의 경우에는..

728x90
반응형