본문 바로가기
반응형

프로그래밍/C++59

C++] mutex정의와 종류에 대하여(RAII mutex) 1. mutex란?? C++ 11 버전에 나온 class로 Thread들의 동기화를 해줄 수 있게 해주는 기능을 가지고 있습니다. Thread들의 동기화란 무엇일까?? 예를들어보자. 우리는 게임을 하기위해 캐릭터를 생성해야 합니다. 해당 캐릭터를 만들려면 캐릭터의 이름이 필요한데, 캐릭터 ID의 중복검사를 한 후 없으면 캐릭터 생성을 할 수 있습니다. 이런식으로 함수에 접근할 것입니다. 하지만 동시에 접근하는 유저수가 100명 이상이라면??? 그 100명이 똑같은 ID로 캐릭터를 생성하려고 한다면?? 어떻게 될까요??? 중복된다고 return받는 Thread들이 있을 수 있고 중복검사를 동시에 해서 똑같은 ID로 만들어지는 Thread들도 있을 것입니다. 왜?? context switching때문입니다... 2020. 6. 13.
C++] RAII란? 1. RAII란?RAII는 Resource acquisition is initialization의 약자로 직여해보면 "자원 흭득을 초기화한다."라고 해석이 됩니다. 즉, "흭득된 자원을 초기화 한다."라고 생각하시면 됩니다. 그럼 RAII는 뭐냐? 키워드냐? 클래스냐? 함수냐?? RAII는 C++설계 패턴중 하나인 키워드입니다. 이러이러한 식의 설계를 RAII라고 부르자고 된것입니다. 그럼 여기서 말하는 이러이러한 식의 설계는 무엇일까? 동적인 프로그래밍을 위해 new라는 키워드를 사용해 힙 메모리에서 메모리를 할당받습니다. 할당 받는순간 해당 메모리의 resource를 프로그래머는 직접 관리하게 됩니다. 해당 메모리 공간을 잘 활용한다면 정말 좋겠지만, 요놈의 실수, 예기치 못한 exception등.... 2020. 6. 13.
C++ std::async 사용방법. 1. std::async에 대한 간단한 설명.std::async는 std::task 클래스 기반으로 만들어진 클래스로 Thread를 만들 때 사용됩니다.std::async는 std::thread와 달리 내부적으로 Thread Pool을 만들어 Thread를 관리하게 되며,예외처리, 값 return 등.... std::thread보다 안정적이며 프로그래머가 사용하기 편리한 기능입니다.std::async는 반환 값을 std::future로 받습니다. 2. std::async constructor#include #include void for_print(char c) { for (int i = 0; i 2020. 6. 10.
C++ thread와 async의 차이점 C++에서 병렬처리를 하기위해 여러가지 클래스를 제공합니다. C++에선 std::thread, std::future, std::async를 제공합니다. 그 중 많이 쓰이는 std::thread와 std::async에 대해 설명해볼까 합니다. 1. C++에서 Thread와 Async는 다른녀석인가? 둘다 같은 쓰레드입니다. 많이 햇갈리는게 Thread라는 개념이 있고, 각 언어별로 Thread를 사용하기위해 프로그래밍 내에 정의된 함수 혹은 객체를 불러옵니다. 해당 Thread를 불러오는 방법은 여러가지일 수 있습니다. JAVA의 interface인 run, 클래스 Thread, C언어의 pthread, C++의 thread, async, task 등.... 전부 다 Thread입니다. 특별한게 없습니다... 2020. 6. 9.
C++ 사용자 Windows의 경로를 가져오기. SHGetKnownFolderPath() 키워드를 사용하여 원하는 경로를 가져올 수 있습니다. 해당 함수를 사용하려면 해더파일을 참조해야 합니다. 사용법 #include #include using namespace std; int main(void) { PWSTR path = NULL; SHGetKnownFolderPath(FOLDERID_Desktop, 0, NULL, &path); //바탕화면 경로 가져오기. wprintf(L"%s\n", path); CoTaskMemFree(path); SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &path); //문서 경로 가져오기. wprintf(L"%s\n", path); CoTaskMemFree(path); ret.. 2020. 6. 4.
C++ 파일 입출력(ofstream, ifstream) Window전용 C++에서 파일 입출력할 때 쓰이는 ofstream과 ifstream에 대해 알아보도록 하겠습니다.(Windows) ofstream(output으로 write할 때 쓰임) : http://www.cplusplus.com/reference/fstream/ofstream/ ifstream(input으로 read할 때 쓰임) : http://www.cplusplus.com/reference/fstream/ifstream/ 사용법#include #include #include #include #include using namespace std; string text = "In 1979, Bjarne Stroustrup, a Danish computer scientist, began work on \"C with.. 2020. 6. 4.
C++] 스마트 포인터에 대하여... 스마트 포인터란?? 기본적으로 포인터라고 하면 *ptr을 떠올리게 됩니다. 그리고 주소 값을 해당 포인터 변수에 넣어주죠. int *ptr = # 이런식으로요.... 하지만 포인터가 new로 생성된 변수... 즉, Heap메모리에 할당된 주소 값을 가르키게 될 때 프로그래머의 실수로 Memory leak이 발생할 수 있습니다. delete를 안해서 말이죠...... 스마트 포인터를 사용하게 된다면 해당 걱정은 없어지게 됩니다. Stack에 선언된 스마트 포인터가 pop이 된다면..... 즉, {} 함수가 끝나게 된다면 Heap에 할당된 메모리는 자동적으로 초기화 시켜줍니다. C++에서 스마트 포인터는 3가지가 있습니다. 1. unique_ptr 2. shared_ptr 3. weak_ptr 그럼 .. 2020. 5. 31.
C++] map 사용법과 원리 map이란? 배열을과 비슷하게 생겼습니다. 배열은 index값을 통해 값을 찾죠. ex) a[3] = { 10. 20. 30 }; a[0] = 10, a[1] = 20, a[2] = 30. 이런식으로 a라는 배열에서 원하는 값을 얻기 위해 0 ~ 2까지의 번호를 입력해 얻어옵니다. map은 순차적으로 증가하는 배열의 index와는 다르게 key와 value로 구성되어 있습니다. key는 사용자가 직접 정의해줘야 합니다. key는 int가 될 수있고 string이 될 수 있고 그밖의 자료형도 가능합니다. map은 다음과 같은 형태로 저장됩니다. map은 red-black tree로 구성되어 key별로 오름차순 혹은 내림차순이 가능합니다. 아무것도 지정안하고 map만 하면 오름차순으로 정렬이 되면서 삽입이 .. 2020. 2. 5.
MSB8020] v142빌드 도구를 찾을 수 없을 때. 보통 visual studio 2019버전에서 github에 작업한걸 올리고 2019보다 아래 버전에서 빌드를 하면 다음과 같은 오류가 나옵니다. 이는 visual studio 2019버전으로 릴리즈 되면서 같이 v142빌드 도구가 생겨난 것이기 때문인데요. 해결방법은 1. 2019버전으로 다시 깔아주거나 2. 빌드 버전을 바꿔주는 방법밖에 없습니다. v142버전은 2019버전만 사용가능하기 때문입니다. 그럼 빌드 버전을 바꿔주는 방법을 알아보겠습니다. 플랫폼 도구 집합을 visual studio 2017(v141)버전으로 바꿔주시면 됩니다. 하지만 왠만해선 최신버전으로 업그레이드 해주세요. 버전마다 폴더 생성위치와 이름이 조금씩 다릅니다. 2019. 12. 29.
visual studio 2017에서 헤더파일을 찾을 수 없을 때. github에서 프로젝트를 받아 visual studio에서 실행시킬 때 발생하는 문제입니다. 보통 버전이 서로 다른 환경에서 저장 후 다운로드를 받아 사용하면 이런 현상이 나타납니다. 그럴경우 아래와 같이 진행해줍니다. 가장 최신 SDK버전 클릭 후 확인. 끝!!. 컴파일 과정에서 MSB8020 오류가 뜬다면 여기를 참고해주세요!!. 2019. 12. 29.
c++의 move, rvalue, lvalue에 대한 설명....(복잡해요~) 무브...... move........ 사전에 알아야할 것들이 있습니다. 1. 복사생성자(깊은복사). 2. static_cast 3. lvalue, rvalue move에 대해 이해하려면 위 3가지는 반드시 짚고 넘어가야 합니다. 1. 복사생성자에 관해선 이미 글을 올린것이 있으니 참고하시기 바랍니다. · 얕은복사와 깊은복사 : https://hwan-shell.tistory.com/42 · 복사생성자의 호출 과정 : https://hwan-shell.tistory.com/43 2. static_cast에 관해서는 아래 링크를 클릭해 주세요. https://hwan-shell.tistory.com/211 3. lvalue, rvalue는 따로 정의할까 하다가같이 설명하는게 좋을것 같아 move와 같이 설.. 2019. 12. 17.
C++ set 사용법과 설명... set에 대해 설명하고자 합니다. 사용법도요. 아마 set을 사용하려고 검색하셔서 오시게 된 분이시라면, set의 특징을 잘 아시는 분일겁니다. 네, set의 특징은 다음과 같습니다. 1. 숫자든 문자든 중복을 없엔다. 2. 삽입하는 순서에 상관없이 정렬되서 입력이 된다. 이 특징을 모두 만족시킬 수 있는 자료구조는 이진 트리 입니다. 즉, set은 벨런스 트리로 Red-Black 트리로 만들어져 있습니다. 이런식으로 말이죠... 이진트리 특성상 삽입과 삭제가 용이합니다. 자료 찾는것도 준수하고요. 그럼 사용법을 알아보겠습니다. Set의 초기화 set 변수 기본적인 선언방법 set 변수(복사할 변수) 선언 후 복사한 값으로 초기화 set 변수 = 복사할 변수 서언 후 복사한 값으로 초기화 #include.. 2019. 12. 13.
C++ string 사용법 및 기능정리(동작방식) C++에는 string이란 클래스가 있습니다. 이걸 사용하려면 string 헤더파일을 선언해 줘야 하며 다양한 기능을 제공합니다. 그렇다면 string이란 녀석이 왜 생겨났을까?? 기존 C언어에서 문자열 처리를 하려면 상당히 골치 아팠습니다. 특히 가변 길이를 처리할때요. 프로그래머가 손수 메모리를 재 할당 해주거나 그게 아니라면 충분한 문자열 배열을 선언해주거나... 너무 번거롭고 나중에 문제생길 것들이 많았죠... 예상치 못한 결과도 초래했다고 합니다. 그래서 C++에서는 class로 문자열을 감싸고 public을 통해 쉽게 사용할 수 있도록 정의하고 만들었습니다. 그래서 C++은 문자열 사용을 기본적으로 string으로 하고 있습니다. 그렇다면 string에 사용법에 대해 알아보도록 하겠습니다. S.. 2019. 11. 25.
C++ vector사용법 및 설명 (장&단점) C++의 vector는 C++ 표준라이브러리(Standard Template Library)에 있는 컨테이너로 사용자가 사용하기 편하게 정의된 class를 말합니다. vector를 생성하면 메모리 heap에 생성되며 동적할당됩니다. 물론 속도적인 측면에서 array(배열)에 비해 성능은 떨어지지만 메모리를 효율적으로 관리하고 예외처리가 쉽다는 장점이 있어 많이 사용하고 있씁니다. 그럼 우선 사용법에 대해 설명하겠습니다. Vector의 초기화 vector 변수명 백터 생성 vector 변수명(숫자) 숫자만큼 백터 생성 후 0으로 초기화 vector 변수명 = { 변수1, 변수2, 변수3... } 백터 생성 후 오른쪽 변수 값으로 초기화 vector 변수명[] = {, } 백터 배열(2차원 백터)선언 및 초.. 2019. 11. 24.
C++ for_each문 개념과 사용법 설명 C++에는 기본 문법인 for문이 있습니다. for문으로 모든 반복문을 만들 수 있고 실행시킬 수 있습니다. 하지만 단순 for문으로 만들기엔 귀찮거나 손이 많이가는 반복문을 만들 수 밖에 없는 상황이 종종 존재합니다. 한가지 예시를 들겠습니다. #include #include #include using namespace std; void print_fnc(int n) { cout 2019. 8. 1.
반응형

스킨편집 -> html 편집에서