프로그래밍 386

점진적 가비지 컬렉션

점진적 가비지 컬렉션이란?UObject를 위한 개선된 가비지 컬렉션 시스템이다. 언리얼 엔진은 마크 앤 스윕 가비지 컬렉터를 사용하여 UObject 메모리를 관리한다.소프트 리얼 타임( soft-real-time ) 애플리케이션의 경우,가비지 컬렉터에 한 가지 큰 단점이 있다.가비지 컬렉터가 어떤 오브젝트의 메모리를 회수할 수 있는지 결정하는 동안Gameplay hitches가 발생할 수 있다는 것이다. UE에서는 이 프로세스를 도달 가능성 분석이라고 한다.UE5는 항상 가비지 컬렉션의이 단계가 한 프레임 내에 완료되도록 의존해 왔으며,이로 인해 일시적으로 모든 UObject 처리가 중지된다. 도달 가능성 분석에서스캔해야 할 오브젝트가 많을수록 일시정지 시간이 길어지고,그 결과 가시적인 게임플레이 히치를..

UE5 2024.11.23

프로그래머스 LV.1 모의고사

https://school.programmers.co.kr/learn/courses/30/lessons/42840 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr    해당 문제는 완전탐색 문제이다. 완전 탐색이란,가능한 경우의 수를 모두 나열하면서 원하는 답을 찾는 방법이다.따라서 해당 경우의 수를 하나하나 if문으로 찾아주면 된다.  내가 처음에 낸 풀이#include #include #include using namespace std;vector solution(vector answers) { vector answer; vector results = { 0,0,0 }; ..

인터페이스

C++ 에는 인터페이스가 없다.따라서 추상클래스로 인터페이스를 구상한다.근데 추상클래스와 인터페이스는 어떻게 구분할까?Interface와 abstract의 차이는 Interface는 함수만 있다는 것이다.또한 인터페이스는 다음과 같이 정의한다. // IFlyable.hclass IFlyable{public: virtual void Fly = 0}; 인터페이스는 클래스 명 앞에 I라는 대문자를 붙여준다.이는 인터페이스임을 명확하게 하기 위해서이다. 또한 함수는 순수가상함수로 만들어준다.인터페이스는 다중 상속을 허용한다. 인터페이스 정리 인터페이스 C++은 자체적으로 인터페이스를 지원하지 않는다. 순수 추상 클래스를 사용해서 Java의 인터페이스를 흉내낸다 순수 가상 함수만 가진다 멤버..

가상 소멸자와 비 가상 소멸자

비 가상 소멸자가상 소멸자를 안쓰는 경우는 어떻게 될까?가상 소멸자가 뭐길래, 가상 생성자는 없으면서가상 소멸자가 메모리 누수를 방지한다고 할까?왜 소멸자에 가상 키워드를 넣어야할까? 그에 대한 예시를 다음과 같이 추상화한 그림을 통해 알아보자. myCat이 delete될 경우(virtual 소멸자가 아닌 경우) 왜 그럴까?전에 정리한 가상 테이블을 기억해내면 금방 왜 그런지 알 수 있다. 만약 virtual 키워드를 붙였을 경우 즉 자신의 실 자료형에 맞는 소멸자를 호출하기 위함이다. 가상 소멸자는 매우 중요하다.반드시 유의할 점은,모든 클래스마다 가상 소멸자를 꼭 써줘야 한다.근데 가상함수 느리다면서가상 소멸자가 있는 클래스를 상속받지 않아도 이러라고? 싶을 수 있다. 근데 업캐스팅 해서 쓸 때,부모..

다형성(Polymorphism)

poly 라는 것이 여러 개라는 뜻을 가지고 있다. 그럼 morphi는 뭘 뜻할까? 모습이란 뜻을 가지고 있다. 여러 모습 즉 다형성이다. 개체지향 프로그래밍에서 많이 쓰이는 것이 다형성이다. 다형성을 배우기 전에, 멤버 함수에 대해 알아보자. 멤버 함수에 대해 말해 보자.다음 그림은 코드를 예시로 어떻게 스택과 힙에 메모리가 적재되는지 추상적으로 가시화한 것이다. 멤버 함수의 메모리 멤버 함수도 메모리 어딘가에 위치해 있다. (사실 사용되는 모든 정보는 메모리에 어딘가에는 위치해 있어야 한다.) 모든 것이 메모리 어딘가에 위치해 있어야 한다. (함수 == 코드 섹션의 주소) 근데 각 개체마다 멤버 함수의 메모리가 잡혀 있을까? 아니다. 모든 개체는 함수 하나를 공유한다. 그 대신 각 멤버 함수는 컴파일..

프로그래머스 LV.1 달리기 경주

https://school.programmers.co.kr/learn/courses/30/lessons/178871 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 1. 이중 포문으로 풀기 (시간 초과) 시간 초과가 난 코드 - 아마 이중 포문 때문일 거 같다. player의 길이가 50000까지이고, calling의 길이가 1000000이니 시간 초과가 날만하다. #include using namespace std; bool cmp(const pair& a, const pair& b) { return a.second < b.second; } vector solution(vector players, ve..

카테고리 없음 2024.11.20

프로그래머스 LV.2 가장 큰 수

https://school.programmers.co.kr/learn/courses/30/lessons/42746 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 처음에 짠 코드는 next_permutation을 이용해서 구현하였다.next_permutation은 모든 경우의 수를 출력해 주기 때문에,가장 큰 경우의 수만 계속해서 담으면 될 거라 생각했기 때문이다.string solution(vector numbers) { string answer = ""; sort(numbers.begin(), numbers.end()); string n = ""; do { n = "..

템플릿의 장단점

템플릿의 장점템플릿이 다른 제네릭 프로그래밍보다 Type Safe하다.템플릿은 컴파일 타임에 받을 수 있는 모든 타입을 오버로딩한다.따라서 템플릿은 제대로 사용하기만 한다면 타입 안전성을 보장한다.하지만 다른 제네릭 프로그래밍은void*로 변환하여 값을 받아오기 때문에,위험성이 따른다.템플릿의 단점템플릿은 동형(homogenous)데이터 구조만 지원한다.데이터 구조마다 한가지 타입으로 된 객체만 저장할 수 있다.앞서 말했듯 템플릿은 동형 데이터 구조만을 지원하며,이를 위해 컴파일 타임에 받아올 모든 타입을 오버로딩하기 때문에,최종 바이너리 코드의 크기가 커지는코드 비대 현상이 발생한다.각 템플릿 인스턴스에 고도로 특화된 코드는그보다 느리지만 범용적인 코드보다 길어지는 경향이 있다.+템플릿과 상속 둘 중 ..

스스로에게 추천하는 SW역량 기르기 좋은 사이트

1. SW Expert Academyhttps://swexpertacademy.com/main/learn/course/subjectList.do?courseId=AVuPDj5qAAfw5UW6 SW Expert AcademySW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!swexpertacademy.com SW 엔지니어(혹은 개발자)역량을 기르기 좋은 사이트 중 하나이다.삼성에서 운영관리 하고 있으며,SW 개발자에게 필요한개발지식 (이산 수학, 자료구조 알고리즘, 기하 등 ... ) 에 대한 좋은 강의를 제공한다.또한 삼성에서 제공하는 코딩 테스트 문제로 현재 자신의 알고리즘 이해도를 높일 수 있다. 2. Udemyhttps://www.udemy.com/가성비의 끝판왕 유데미.강..

힙을 이용한 데이터 리스트 병합

유전자 관련 생명의학 응용 프로그램에서대용량 데이터셋을 처리하는 경우를 가정해보겠다.유사성을 계산하려면 정렬된 DNA 순위가 필요하다. 그러나 데이터셋이 너무 방대하기 때문에 단일 머신에서 처리할 수 없다.그러므로 분산 클러스터에서 데이터를 처리하고 저장하며,각각의 노드는 일련의 정렬된 값이 있다. 주 처리 엔진은 이들 데이터를 모아서 정렬된 단일 스트림으로 변환해야 한다.다수의 정렬된 배열을 합쳐 하나의 정렬된 배열을 만드는 기능을 벡터로 제작해보자. 각각의 리스트는 이미 정렬되어 있기 때문에각 리스트의 최소 원소는 맨 앞에 위치한다.힙에서 최소 원소를 가져온 후 이를 제거하고,최소 원소가 있던 리스트에서 그 다음으로 작은 원소를 선택해 힙에 추가한다. 힙의 노드는 이 원소를 어느 리스트에서 가져왔는지..