![[CPP] std::move와 const제약](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBvwcS%2FbtsOiokPdhS%2FQO2x6kaHcFbS60vM9yrrG1%2Fimg.png)
std::move와 const 제약에 다룬 글이다. 이동생성자와 perfect fowarding과 밀접한 연관이 있는데 perfect forwarding은 다음 글에서 다루도록 하겠다. 우선 이동생성자(및 이동대입 연산자)가 무엇인지 부터 알아보자.MSDN을 보면 '이동 생성자를 사용하면 rvalue개체가 소유한 리소스를 복사하지 않고 lvalue로 이동할 수 있습니다.' 라고 되어 있다. 게임에서 예를 들어보면 level_a에 player가 있고 이제 이 player가 level_b로 이동했다고 해보자.그럼 level_b에서 player에 대한 정보를 싹다 복사해서 level_b에 동일한 데이터로 player를 생성할 수 있다.근데 player가 10MB의 용량을 가진다면 level_b로 이동하는데 ..
![[C++] std::vector resize와 reserve의 차이점](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw6Kpv%2FbtsNMSyVFdj%2F0JtMAR0DUgLnhi5xCcYq20%2Fimg.png)
STL의 대표 컨테이너인 vector의 resize와 reserve의 차이점을 알아보도록 하자.resize는 코테 공부를 할 때 정말 많이 사용했었는데 reserve는 가끔만 사용했었는데 둘의 차이점이 있다는 점정도만 알고 넘어가다가 도저히 안될거같아서 정리한 글이다...ㅠ 우선 vector자체는 가변배열이다. 데이터를 push_back하다가 보면 현재 동적할당받은 크기를 넘어서는 순간 다시 현재 사이즈 보다 더큰 배열을 동적할당하여 데이터를 새로 동적할당한 곳으로 복사한다. 이렇게 동적할당하고 복사하고~ 이런 과정의 비용이 비싸기 때문에 동적할당을 한번만 수행하여 비용을 낮추는데 주로 사용되는 vector의 멤버 변수가 두가지가 있다. 바로 resize, reserve이다. (동적할당이 어떻게 발생하고..

class A{public: int hp = 0;};int main(){ A* a = new A(); delete a; a->hp = 200;}위 코드를 보자 분명 delete를 하고 a = nullptr로 밀어준다음에 nullptr확인을 안하고 해제된 메모리에 값을 쓰고 있다.분명히 잘못된 코드인데 때에 따라서 크래쉬가 날 수도 있고 안 날 수도 있다. delete키워드가 소멸자를 호출해주고 메모리를 해제하는 것은 맞지만 메모리 해제를 바로 os에게 요청하지 않기때문이다.delete는 객체가 차지했던 메모리 블록을 힙에 반환한다. 여기서 중요한 부분은 메모리 블록을 운영체제에게 즉시 반환하는게 아니라 힙 관리에게 반환한다는 것이다.힙 관리자는 반환된 메모리 블록을 재사용가능한 공간으로 관리한다. 따라서..
![[C++] 다형성과 가상 소멸자](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWB2bS%2FbtsMUrxouUA%2F6Lqw6AbYE9q31kYQ6JsTy1%2Fimg.png)
C++은 객체 지향 프로그래밍 언어이다.OOP의 속성으로는 은닉화, 캡슐화, 상속성, 다형성이 있고 OOP의 특성으로는 추상화가 있다.이중에서도 다형성은 쉽게 말하면 '모습은 같은데 형태는 다른 것'을 의미한다.상속관계에서 다형성이 활용되는데 주의해야할 것들 중 이번 글은 '가상 소멸자'에 대한 부분이다. parent* p = new child();우리는 위처럼 '업캐스팅'을 자주 사용할 때가 많다. 위 코드를 컴퓨터 입장에서 보면 부모 클래스 포인터로 무엇인가 가르키고 있기 때문에 가르키는 대상이 무조건 부모 클래스 객체라고 생각할 수 밖에 없다.(원하는 동작은 parent*로 가르키고 있지만 실 객체는 child라고 인식 시키고 싶은 것이다) 위 코드는 child클래스가 parent클래스로 부터 함수..
![[C++] 스마트 포인터](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiB1C3%2Fbtst0yl8cYN%2FEEYcZWOQmMwmLMhQtoTUY1%2Fimg.jpg)
이번글은 C++의 스마트 포인터에 대한 글입니다. 스마트 포인터 C++이후에 나온 언어들을 보면은 C#, JAVA 등등은 '가비지 컬렉터'라고 불리는 '자원 청소기'가 내장되어 있습니다. 프로그램 상에서 더이상 사용하지 않는 자원들을 자동으로 해제 해주기 때문에 사용자가 굳이 메모리 해제를 일일히 신경쓰면서 작업할 필요가 없습니다. 하지만 우리의 C++의 경우 이딴건 지원을 하지 않습니다! (이게 매력인거 같습니다) 그래서 스마트 포인터를 사용하는데 스마트 포인터를 사용하는 가장 큰 이유는 'RAII'때문입니다. Resource Acquisition Is Intialization이라는 말인데요 '오브젝트와 자원 획득과의 초기화를 같이한다(생명주기를 같이한다)'라는 말입니다. (따라서 모든 스마트 포인터는..
![[C++] union (DX Matrix)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBYCut%2FbtssZgtFKj9%2FuzWVLeTiAtQKdLAtaTkfCK%2Fimg.jpg)
이번글은 union 키워드에 대한 간단한 글입니다! union union이란? A union is a special class type that can hold only one of its non-static data members at a time. 라고 합니다! 해석하면 한번에 하나의 non-static 데이터 멤버를 가질 수 있다고 합니다. 약간 카멜레온을 생각해주시면 될거같습니다. 어쩔때는 A였다가 어쩔때는 B였다가 하는 식으로요(저는 이렇게 이해했습니다) 아니면 키워드 그대로 '연합체'느낌으로 받아 드리셔도 될거같습니다. 우리는 하나의 연합체다ㅎㅎ 그래서 메모리도 공유한다. 또한 union은 다른 데이터 멤버중에 가장큰 크기를 가지는 데이터 타입의 크기를 할당받습니다. 바로 예시코드를 보면서 이..
![[C++] initializer_list](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fql8oa%2FbtsrUrKOlOw%2FCBJPkqLP8Jdmkq3cUlpHDk%2Fimg.jpg)
이번 글은 std::intializer_list 생성자에 대한 글입니다! C++11부터 지원된 문법이며 '경량 프록시 오브젝트(lightweight proxy objet)'라고 합니다. '프록시'에 대한 부분은 https://d-yong.tistory.com/49 해당 블로그를 참고해주세요! 간단하게 말하면 뭔가 '대리인 객체'? 대신 생성해주는 느낌으로 이해하시면 될꺼같습니다. 왜냐하면 std::initalizer_list가 실제 리스트 요소를 포함 하지는 않고, 리스트의 요소에 대한 포인터를 포함하고 있기 때문입니다. 문법은 아래처럼 '중괄호'를 통해 빠르고 간편하게 std::vector를 초기화 할 수 있게 되었습니다. std::vector vec = {1, 2, 3}; 주의할 점은 생성자들 중에 ..
![[C++] 가변 길이 템플릿과 후행 리턴 타입](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrK79l%2FbtsrEyoQt7V%2FxBmE1tQhqQ94KdAfWQbbz1%2Fimg.jpg)
arr = [1, 3.14, 0x16] 위의 파이썬 코드는 아무 문제 없시 사용이 가능합니다 하지만 이를 C++에서 구현을 하려면 어떻게 해야할까요? 이를 C++에서 구현하기 위해서는 '가변 길이 템플릿', '후행 리턴 타입', 'common_type'에 대한 개념이 필요합니다 먼저 가변 길이 템플릿부터 알아보도록 하겠습니다. 가변 길이 템플릿 이란 의 두번째 템플릿 매개변수 typename뒤에오는 '...' 를 의미합니다. 이를 템플릿 파라미터 팩이라고 부릅니다. print(1, 3.14, 0x16) 파이썬에서 print함수는 처럼 막 바로 출력이 가능합니다. 이를 C++로 구현을 하면은 template void Print(T arg) { std::cout