c++

    현재 적용할 메모리 풀

    기존 오브젝트 풀 개선 https://jartlife.tistory.com/59 메모리 풀, 오브젝트 풀 개념 힙 메모리 단편화 힙 단편화( heap fragmentation ), 메모리 단편화( memory fragmentation )이라 부르는 이 현상은 객체를 자주 동적할당할 때 발생한다. 메모리들이 직렬화되어 전부 붙어있으면 좋겠지만, jartlife.tistory.com 이전 게시글의 오브젝트 풀을 개선하여 이번 프로젝트에 쓸 메모리 풀을 만들었다. 커스텀 삭제자를 지정한 유니크 포인터를 통해 자동 반납을 구현했다. 객체 생성자의 호출 시점을 할당 시점으로 옮기고, 소멸자의 호출 시점을 반납 시점으로 옮겼다. alloc은 생성자로 인자를 전달하므로 기본 생성자가 없거나 생성자 종류가 여러 개인 ..

    메모리 풀, 오브젝트 풀 개념

    힙 메모리 단편화 힙 단편화( heap fragmentation ), 메모리 단편화( memory fragmentation )이라 부르는 이 현상은 객체를 자주 동적할당할 때 발생한다. 메모리들이 직렬화되어 전부 붙어있으면 좋겠지만, 힙 메모리에서는 메모리들이 붙어있다고 장담할 수 없다. 할당되는 메모리 조각들은 서로 거리가 있는 편이다. 어쩌다가 연속된 메모리들이 있어도 중간에 메모리를 삭제해버리면 그 사이에 원래 있던 메모리 만큼의 틈이 발생하게 된다. 힙 메모리 단편화로 인해 빈 메모리가 자주 발생해버리면, 실제 메모리 크기에는 여유가 있지만 특정한 크기의 객체를 할당할 수 없는 일이 발생한다. 빈 메모리 총합은 10000 byte 지만 모든 빈 메모리가 1000 byte 이하일 경우, 2000 b..

    게임 저장 구현 - 구조체를 파일로 저장하기

    배경 게임은 게임 내용을 저장하고 불러오는 기능이 필요하다. 저장과 불러오기는 유저의 하드디스크에 게임 파일을 저장하고 불러오는 일로서, 파일 입출력에 해당한다. 문자열로 패턴화하여 .txt 나 .csv 와 같은 문서를 작성해 게임의 내용을 저장할 수도 있으나 훨씬 더 코드를 작성하기 편하면서 유저가 함부로 세이브파일을 뜯어볼 수 없고 파일 확장자명도 내 마음대로 지정 가능하도록 하기 위해 바이너리 파일로 저장한다. 아이디어 저장할 정보들을 담는 구조체를 정의한다. 파일 경로과 저장할 정보들을 담는 구조체를 참조해 저장/불러오기 를 구현한다. 파일 경로에 해당하는 파일을 바이너리 모드로 연다. 구조체의 내용을 구조체의 크기만큼 메모리에 저장/불러오기 한다. SaveFile 구조체 // saveload.h..

    데이터베이스 구현

    아이디어 csv 문서를 파싱해 https://jartlife.tistory.com/53 csv 문서 파싱 csv 파일 csv(comma-separated values) 파일은 쉼표로 구분되는 문자열을 나열한 파일 형식이다. 엑셀과 메모장에서 csv파일을 쉽게 보고 편집할 수 있다. 데이터베이스를 csv 파일로 구축하면 각 필드를 jartlife.tistory.com stringstream 으로부터 https://jartlife.tistory.com/55 std::stringstream 을 통해 문자열을 값으로 문자열을 값으로 int, double, long 같은 primitive 자료형은 헤더만 추가하면 얼마든지 std::stoi, std::stod, std::stol 과 같은 함수를 통해 문자열을 실제..

    std::iostream 으로 std::tuple 입출력하기

    istream& operator>>, ostream& operator> 연산자를 오버로딩하지 않았으므로 std::istream 으로 std::tuple 을 입력받을 수는 없다. 같은 논리로 std::ostream 에 std::tuple 을 출력할 수도 없다. 따라서 std::istream 과 std::tuple 을 받는 operator>> 를 사용자가 오버로딩하면 충분히 std::istream 으로 std::tuple 을 입력받을 수 있고, std::ostream 과 std::tuple 을 받는 operator get( tup ); ss >> get( tup ); ss >> get( tup ); ss >> get( tup ); cout

    std::stringstream 을 통해 문자열을 값으로

    문자열을 값으로 int, double, long 같은 primitive 자료형은 헤더만 추가하면 얼마든지 std::stoi, std::stod, std::stol 과 같은 함수를 통해 문자열을 실제 값으로 변환할 수 있다. 그러나 각각의 함수 이름을 외워야 하는 것은 물론, 사용자 정의 클래스로 변환해주는 함수는 존재하지 않는다는 단점이 있다. stringstream std::stringstream 을 입력하면 문자열을 입출력 스트림처럼 다룰 수 있다. ( 입출력 스트림은 std::cin 과 std:: cout 으로 대표된다. ) 스트림에 출력된 내용은 스트림 내부에 문자열로 변환되어 저장되고 스트림에서 입력받을 때에는 문자열을 꺼내와 입력받을 객체의 타입에 맞게 변환한다. std::iostream 을 ..