목록분류 전체보기 (150)
개발하는 리프터 꽃게맨입니다.
필요해서 직접 만든 STL 호환 '크기 고정 벡터'입니다. '동적 배열'을 사용하지 않고 굳이 fixed_vector라는 고정길이 벡터를 만든 이유는 기존 '동적 배열'은 매우 뛰어난 자료구조이지만 몇 가지 문제점이 있습니다. 1) 힙 메모리를 사용하기 때문에 스택 메모리에 비해 조금 느리다. 2) 재할당 발생 시 O(n)의 시간복잡도가 소모된다. (초기화시 큰 reserve 를 할당하면 해결 가능) 3) 잦은 재할당 발생시 메모리 파편화 현상이 문제가 될 수 있다. 그렇기 때문에 굳이 동적 배열이 필요하지 않은 경우에는 일반 '배열'을 사용하는 것이 더 유리할 경우가 있습니다. 그냥 배열을 쓰지 않고 fixed_vector를 만든 이유는 필요시 편리한 기능이나 오류 체크 같은 것을 하기 위함이고 최적화..
[ 목차 ] 1. 람다 표현식 C++에서는 '호출할 수 있는 객체'를 callable이라고 말합니다. 그 종류는 총 5개 1) std::function 2) 함수 포인터 3) operator() 4) bind에서 나온 타입 (아직 다루지 않은 내용) 그리고 lambda 람다식입니다. 새로운 '호출성 객체'라고 하죠, 람다는 다른 언어에서는 익명함수, 무명함수라고 말하며 기능적으로는 '재활용하지 않는 일회용 함수'라고 말합니다. 이름이 없고, 필요할 때 딱 만들어서 쓰고 버리는 함수라고 할 수 있죠. 예시는 아래와 같습니다. 즉석 해서 함수를 정의한다고 보면 되겠습니다. 이런 식으로 람다 변수로 초기화해서 호출하는 방법도 있고, 바로 호출하고 버리는 방법도 있고, 매개변수로 넘기는 방법도 있습니다. 더 다..
[ 목차 ] 이전 포스팅 https://powerclabman.tistory.com/48#6._%EB%A7%88%EC%B9%98%EB%A9%B0 [C++] 스마트 포인터 - 1 (unique_ptr, unique_ptr 역설계) [ 목차 ] 1. 동적 메모리 C++에서 동적 메모리는 new로 할당하고 delete로 해제합니다. new는 객체를 할당하고 초기화하여 그 객체에 대한 포인터를 반환하고 delete는 소멸하며 할당한 메모리를 해제하 powerclabman.tistory.com 따로 복습을 위한 서술은 없습니다. 1. shared_ptr shared_ptr 은 본격적으로 자동 메모리 관리를 하기위한 포인터입니다. 내부에는 ptr 과 control_block 이 존재하고, ptr은 객체를 참조하기위..
[ 목차 ] 1. 동적 메모리 C++에서 동적 메모리는 new로 할당하고 delete로 해제합니다. new는 객체를 할당하고 초기화하여 그 객체에 대한 포인터를 반환하고 delete는 소멸하며 할당한 메모리를 해제하죠. C++ 스타일의 동적 메모리는 Java, C#에 비해 빠르지만 큰 단점이 있는데, 메모리의 할당과 해제를 모두 프로그래머에게 맡긴다는 것입니다. 말로만 들어도 위험하죠? 객체를 생성했으면, 반드시 해제해 줘야 문제가 생기지 않는다는 건데, 이게 말처럼 쉽지 않습니다. 위와 같은 코드가 있다고 가정합니다. 함수 func에서 MyClass 메모리를 할당하고, 나중에 해제하려도 시도는 하고 있지만, 중간에 return을 만나서 함수가 종료되어 버리면, 그대로 메모리 누수가 일어나는 거서입니다...
[ 목차 ] 1. 왼값 vs 오른값 왼값(l-value), 오른값(r-value)에 대해 알고 계신가요? 아마 처음 들어보실 수도 있는데, 이렇게 생각하시면 편합니다. 왼값: 데이터를 저장할 수 있는 값, 지속되는 값 오른값: 일시적인 값, 임시적인 값 아직 잘 모르겠죠? 식이 있을 때 좌항을 왼값, 우항을 오른값이라고 이해하시면 기본적인 이해는 가능합니다. (왼값에 왼값을 넣을 수도 있어서 맞는 설명은 아닙니다.) 오른값에 특정한 값을 집어넣는 것은 불가능합니다. 10 = num; 과 같은 코드가 상식적으로 이해되지는 않죠. 일단 오른값에 대한 기본 개념은 이 정도로 이해하시고 넘어가시면 되겠습니다. 왼값: 주소를 가지는 변수, 값을 저장할 수 있는 변수, 지속되는 값 오른값: 상수나 일시적인 값들, ..