유니크 포인터 unique_ptr 스마트 포인터란? * 유니크 포인터는 스마트 포인터의 한 종류이다. * 스마트 포인터란 포인터처럼 동작하는 클래스 템플릿이다. * 스마트 포인터는 unipue_ptr, shared_ptr, weak_ptr 등이 있다. 기존의 포인터 Dog* dog = new Dog(10, "까망이"); delete dog; * C++에서 new 연산자를 통해 heap 영역에 생성된 객체는 포인터를 가지고 접근해야 한다. 객체를 삭제하고 싶으면 포인터를 사용해 직접 메모리를 해제해야 한다. * 스마트 포인터를 사용하면 직접 delete를 할 필요 없이 알아서 메모리를 해제한다. 메모리 누수가 일어날 확률이 적어지며, 가비지 컬렉션보다 빠르다. * 스마트 포인터와 비교하기 위해 기존 포인터..
restrict 키워드 restrict란? * 포인터 변수에 사용 가능한 키워드이다. * restrict는 특정 메모리를 사용하는 포인터가 단 하나임을 뜻한다. 하지만 컴파일러가 이를 무시할 수도 있다. 즉, restrict를 붙인 포인터 변수는 그 메모리를 가리키는 유일한 포인터이다. 유일함에서 오는 장점 * 컴파일러는 코드를 방어적으로 구현하는데 많은 노력을 기울인다. 방어적 구현 중에는 포인터가 가리키는 메모리가 중첩되어 데이터 손실이나 오류가 일어나는 것을 막는 것이 있다. * 함수 안에서 같은 변수를 3번 사용한다면? => 메모리가 겹쳐서 값이 변할 수 있으므로, 컴파일러는 3번 변수를 사용할 때 3번 변수를 호출한다. * 함수 안에서 restrict가 붙은 변수를 3번 사용한다면? => 1번만..
연결 리스트 Linked List 개념 * node라는 구조의 집합니다. * node = 값 + (다음 노드를 향하는 포인터)로 구성되어 있다. [값 + 포인터] 구조가 갖는 장점 * 포인터가 다음 값의 위치를 알고 있으니 배열처럼 메모리가 빈틈없이 연속적일 필요가 없음. = 자료들이 산재해 있다. * 자료들이 여기저기 떨어져 있다면? = 동적 할당 (아닐 수도 있지만 보통 동적) * 연결 리스트에 최대 길이 따윈 없다! = 포인터로 다음 값을 알아낸다 -> 메모리에 값이 분포될 수 있다 -> 최대 크기 설정이 없다 node의 구조 typedef struct node{ int num; struct node* next; }node_t; * 가볍게 보면 어지러울 수 있다. 천천히 구조를 생각하자 * node..
void* memcpy(void* dest, const void* src, size_t count); 매개변수(인자) void* dest = 복사 데이터를 받을 주소 const void* src = 원본 주소 size_t count = 복사할 데이터의 크기 (바이트) 반환값(리턴값) void* = dest가 반환된다. 설명 * src를 시작점으로 count 바이트만큼 복사해서 dest에 집어넣는다. * 바이너리(이진법) 형태로 복사하기 때문에 널문자로 같이 복사될 뿐이다. * 무식하게 복사하기 때문에 양쪽에 자료형이 뭔지 상관없다. 그냥 복사한다. * 오버플로우가 일어날 수 있다. * #include 를 해야 한다. 예제 #define _CRT_SECURE_NO_WARNINGS #include #incl..
struct (구조체) 구조체를 매개변수로 넘길 때 void fuc(구조체); * 구조체를 매개변수로 넘기거나 대입하는 것만으로 복사가 일어난다. 알아서 전부 복사해주니 편하다. * 구조체의 크기가 클 경우, 매번 일어나는 복사는 무거울 수 있다. void fuc(*구조체); * 단 4바이트! * 복사가 훨씬 안전해. 참조의 경우 원본 손실이 발생할 수 있다. * (*구조체).변수 = 값; * 구조체->변수 = 값; (둘 중 하나를 써야 함) 구조체에 배열을 넣을 때 1. 배열 포인터만 넣을 때 typedef struct { char* name1; char* name2; char* name3; char* name4; } name4_t; ↑ 크기가 단 16바이트! 얕은 복사와 유동적인 주소값이라는 제한적 ..