일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- baekjoon
- 프로그래머스
- 오블완
- RVO
- softeer
- UnrealEngine5
- directx
- DirectX11
- const
- algorithm
- 티스토리챌린지
- IFileDialog
- 팰린드롬 만들기
- GeeksForGeeks
- DeferredRendering
- UnrealEngine4
- Programmers
- C++
- winapi
- Frustum
- UE5
- RootMotion
- 2294
- Unreal Engine5
- NRVO
- C
- 언리얼엔진5
- 백준
- 1563
- 줄 세우기
- Today
- Total
목록C++ (41)
Game Develop
https://dobby-the-house-elf.tistory.com/358 [C++] 구조체의 크기 (size of struct) 구조체의 크기는 구조체를 구성하는 요소들에 의해 정해 집니다. 하지만 크기를 출력해보면 예상한 값과 다르게 나올때가 있는데, 그 이유와 구조체의 구조에 대해 알아보겠습니다. struct Packet00 dobby-the-house-elf.tistory.com 친절한 설명은 이미지가 포함되어있는 위 글에서.. 기본적으로, 최종 크기는 가장 큰 데이터타입의 배수이다. 기본적으로 여러데이터타입이 있을 경우, 가장 큰 것을 기준으로 한다. 그렇다고 가장큰 것 * 변수개수가 아니다! 각각 데이터크기 1, 2, 4 (char, short, int) 가 있으면 ‘일단’ 할당받을 메모리..
공통점?: 선언부부분에 바로 정의하면은 인라인으로 처리된다. 기본접근자. 클래스는 private, 구조체는 public이다. 왜그럴까? -> c는 원래 구조체를 썼었고, 접근지정자란 개념이 없었다. 즉 모두 public이란 뜻. 근데 c++에서 갑자기 기본접근지정자는 private으로 하면 c프로그램을 컴파일하려할 경우 코드를 다 다시 짜야할 것이다. 그래서 기본을 public으로 해놓는것. 클래스가 private인 이유는 객체지향적인 이유중 은닉성때문인 것 같다.
함수호출에 관한 최적화 기법으로 Tail Call Optimization, Tail Recursive Elimination이라는것이 있다. 글마다 뭔가 조금씩 차이가 있는것 같긴한데, 기본적인 이해를 위해 잘 정리된 글들이 있어 먼저 소개한다. https://tiger1710.tistory.com/56 Tail Call Recursion Tail Call Recursion제가 이번에 설명할 것은 제가 검색하다가 발견한! Tail Call Recursion 이라는 새로운 재귀?적인 방법의 코딩입니다. 기존의 재귀함수와 비교하면서 설명하도록 하겠습니다.IDE : Visual S tiger1710.tistory.com https://hongjw1938.tistory.com/192 알고리즘 - Quick(퀵) ..
원래는 막연히 그냥 quickSort를 메인으로 좀 더 개선한 알고리즘으로 정렬한다... 라고만 알고 있었다. 그러다 좀 더 자세한 정보들을 접하게 되면서 글로 남겨본다. 본 글은 아래 링크의 글을 정리한 내용이다. https://www.geeksforgeeks.org/introsort-cs-sorting-weapon/ Introsort - C++’s Sorting Weapon - GeeksforGeeks A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitiv..
특정 클래스에서 크기가 큰 멤버변수를 Get하고 싶을 때, 위 코드처럼 참조자를 활용하는것도 고려할 방법 중 하나이다. A클래스가 정말 크기가 큰 데이터라 가정했을 때, 참조자말고 그냥 리턴시키면 값복사하는데 꽤나 비용이 들 것이다. 하지만 저렇게 참조자로 하면 복사할 필요 없으니 굿... 다만 const 키워드를 꼭 붙이도록 하자. 참조자를 리턴시키기 때문에 캡슐화가 깨질 수 있기 때문이다. 해당 참조자로 밖에서 임의로 값을 변경하는걸 막아야 한다. 위 코드는 그냥 예시용 코드긴 한데, A클래스의 print에 const가 붙어있는 이유는, GetA()는 결국 const 객체의 참조자를 리턴하는 것이기 때문이다. const객체는 const 멤버함수만 호출할 수 있기 때문에, print함수에 const키워..
main함수에서의 Test클래스의 GetName함수는 에러가 안나는데, foo함수에서의 GetName은 위와같은 에러가 뜬다. 그 이유는 main함수에서의 t라는 Test객체는 const 객체가 아니고, foo함수에서의 레퍼런스로 받은 t는 const 객체이기 때문이다. const객체는 내부 값의 변경이 불가능하다. 그렇기 때문에 해당 객체가 하는 모든행위는 기본적으로 객체의 값이 변경이 되지 않는다는 '보장'을 받아야 한다. 그 보장을 받기위한 방법 중 하나가, 멤버함수의 선언 끝에 const키워드를 붙이는 것이다. 멤버함수의 뒤에 const키워드가 붙는다면, 해당 멤버함수내에서는 멤버변수에 값을 write하는 행위는 할 수 없다. 그렇기 때문에 foo함수에서의 GetName은 위와 같은 에러를 뱉는 ..
미리 충분한 크기의 메모리를 확보하지 않은 vector같은 경우, capacity이상의 원소를 push 하려 할 경우, 재할당을 통해 capacity를 늘린다. (push든, insert든) v는 8개의 원소로 초기화되었기 때문에 초기 capacity값은 8이다. 그 상태에서 추가로 원소를 push한다면 메모리가 부족하기 때문에 더 큰 크기의 메모리로 재할당을 해줘야한다. 보통 1.5배 크기로 재할당 되며, 그렇기때문에 위 코드에서 푸쉬 후의 capacity는 8 * 1.5인 12가 재할당되었다. 메모리재할당은 런타임도중에 자주 일어나면 안되는 행위중 하나이다. 이렇게 메모리재할당이 많아진다면 메모리단편화도 많이 발생할 것이다. 그렇기 때문에 만약 해당 vector에서 최대로 사용할 원소의 개수를 미리 ..
Text 세그먼트(혹은 Code 세그먼트)는 일반적으로 변하지 않는 영역이고, 변하지 않아야하는 영역이다. 그래서 ReadOnly 영역이며, 그렇기 때문에 리터럴값들이 여기에 저장될 수도 있는듯 하다. 위 이미지에선 리터럴값이 rodata(.rdata)에 저장되어진다고 나와있는데, 숱한 구글링을 통해 지식들을 취합해본 결과, 컴파일러에 따라 rodata 세그먼트일 수도 있고, Text세그먼트일 수도 있다고 한다. Data 세그먼트(.data)는 보통 초기화된 전역변수나 정적변수가 들어있다고 한다. 거기서 좀 더 쪼개자면, '초기화된 읽기전용 영역'과 '초기화된 읽기-쓰기 영역'으로 나눌 수 있다. 아래 두 변수가 전역이라는 가정하에 // 전역변수 const char* cp = "maxlevel"; // ..