시작
int * arrayTest를 배열처럼 사용 가능합니다.
arrayTest[3]은 *(arrayTest + 3)이랑 동일합니다.
이는 int라는 자료형이 4의 크기이기 때문에 *(arrayTest + 1)이면 +4만큼 이동하고, double은 8의 크기이기 때문에 +8만큼 이동해서 작동하게 됩니다.
퍼지이론
퍼지이론은 간단하게 30도일 때, 출력의 100%의쓴다고 가정을 해보겠습니다.
25도는 전력의 80% 사용, 30도는 전력의 100% 사용, 35도는 전력의 80%를 사용하듯,
즉 특정 상황에 대하여 부드럽게 제어하는 것입니다.
https://happy8earth.tistory.com/501
위의 블로그에서 에어컨으로 예를 들어주셨습니다.
Union
struct Vector를 정의합니다. 그렇다면 struct 3*3이랑 flaot vec[3][3]이 동시에 존재하는 것입니다.
그리고 둘다 같은 float이므로 메모리 사용량도 같을 것입니다.
메모리가 공유되기 때문에, _11은 vector.vec[0][0]이랑 같은 주소를 가지게 됩니다.
나중에 좀 더 깊숙히 다뤄보고 싶습니다.
메모리 계층 구조와 기타
메모리 구조에서 Heap은 위에서 밑으로 추가되며, Stack은 밑에서 위로 추가됩니다.
이러한 경우에도 Heap과 Stack이 충돌하게 되면 스택오버플로우가 발생합니다.
추가로 C언어는 C#과 달리 박싱/언박싱 개념이 없습니다.
이는 C#은 object가 최상위클래스로 존재하면서 값 타입과 참조 타입 간에 변환이 일어나지만 , C언어에서는 메모리 주소로 접근하기 때문입니다.
malloc.h는 동적으로 메모리를 관리하는데에 연관이 있으며, Windows.h는 윈도우 관련에 연관이 있습니다.
윈도우에 관한 것을 쓰려면 Windows.h를 써볼 것..!
마지막으로 파일 입출력때에도, 파일 여는 것과 닫는 것이 세트였듯이,
메모리 할당과 해제도 세트로 하는 것이 핵심입니다.
정적 메모리
정적 메모리입니다.정적 메모리는 1024 * 1024 즉 1MB정도 사용 가능해야합니다.
하지만 1,048,576에 못 미치는 1,033,216바이트를 사용하였음에도 스택오버플로우가 발생하고 말았습니다.
StackFrame의 값이 실제로는 좀 더 작다는 것을 알게되었습니다.
동적 메모리 할당으로 하게되면, 스택오버플로우 문제 해결에 도움이 됩니다.
동적 메모리
우선 malloc입니다. 1 ~ 5까지 올바르게 출력 되었지만, p의 메모리 할당을 해제하고 나서는 값이 망가진 모습입니다.
malloc로 생성하면 free로 할당을 해제합니다.
여기서 malloc를 추적하면 size_t에 관한 정보가 나오는데, 결국은 unsigned int입니다.
다음은 New입니다. new 키워드로 할당을 해주며, 겉으로는 malloc와 비슷해 보이는 모습입니다.
위험한 것은 이미 할당이 해제가 된 이후에 사용을 하려한다거나,
delete[]가 아닌 delete로 해제하는 경우입니다.
malloc와 new 의 큰 차이점은 생성자를 호출하는 가입니다.
malloc의 경우는 생성자 호출 없이, 단순히 지정한 크기만큼 메모리를 할당하고
new의 경우는 생성자가 호출하여 객체를 초기화하는 과정까지 있습니다.
가상 메모리
가상 메모리입니다. MEM_RESERVE를 통하여, 사전에 메모리 공간을 준비하게 됩니다.
PAGE_READWRITE이므로 읽기,쓰기가 가능합니다.
그리고 temp에다가 준비된 공간의 주소를 알아냅니다.
주소를 통해 SSD에 존재하는 가상 메모리 곤간에 카피하고, 기존 metrix는 해제하게 됩니다.
값을 부여하는 코드를 추가하고 나서, 출력해보면 둘이 값이 동일한 모습입니다.
VirtualFree로 가상메모리 할당을 해제하고 난 뒤 값을 불러왔더니, 역시 터진 모습입니다.
이는 주소 사상 방식을 거쳐서 SSD의 가상메모리 영역에 값이 들어간 것입니다.
일단은 파일과 파일 사이에 있더라도 할당할 크기가 된다면 1번이나 2번에 들어가고 크기를 초과하면 3번으로 들어가는 것이 기본원리라고 생각하였습니다.
주소 사상 방식
우선 가상 메모리의 중요성입니다. 정점을 구성하는데에 삼각형 한개당 9 * 4해서 36 바이트로 잡겠습니다.
실제로는 훨씬 더 많은 요소가 있는 것으로 알고있습니다.
그리고 사각형을 만들려면 36 * 2로 72입니다.
맵을 만들 때, 1m를 72Byte로 가정하고, 1000km라는 맵을 구현한다고 보겠습니다.
그러면 72,000,000Byte입니다.
72,000,000Byte -> 72,000MB -> 72GB 어림잡아도 이러한 값이 나옵니다.
분명 계산에 문제가 있는 듯하지만... 결과적으로는 현제 사용하는 가정용 RAM에서는 돌리기 힘들것입니다.
간단하게 직접 사상, 완전 연관 사상, 집합 연관 사상이 있습니다. 사상이라는 것은 매핑과 같은 의미입니다.
https://kimtaehyun98.tistory.com/48
직접 사상은 정해진 공간에 매핑하게 됩니다. 이는 적중률이 낮고, 접근 속도가 빠릅니다.
완전 연관 사상은 비어있는 공간에 매핑을 하며, 직접 사상보다 적중률이 높지만, 직접 사상보다 느립니다.
집합 연관 사상은 정해진 공간와 비어있는 장소에도 매핑을 합니다. 그러므로 완전 연관 사상 보다는 빠르지만, 완전 연관 사상보다 적중률을 낮을 것입니다.
SSD혹은 HDD에서 game.exe를 실행시키면 RAM에 올라갈 것입니다. 그 이후에도 레지스터든 VRAM이든 RAM과 상호작용이 일어납니다.
이 때에, HDD에서 RAM으로 상호작용 할 때에는 SSD에 비하면 느리기 때문에 ,게임에서 실시간으로 로딩을 한다고 할때에, 훨씬 빠른 로딩이 보일 것입니다.
추가로 다이렉트 스토로지 같은 방식을 통해 훨씬 빠르게 게임을 즐길 수 있습니다.
이론상으로는 SSD에서 CPU를 거치지 않고, GPU로 데이터를 요쳥하는 방식입니다. 실제로는 다른듯 합니다.
https://yelobean.tistory.com/45
감사합니다.
'학원' 카테고리의 다른 글
c - 2024-11-13 (1) | 2024.11.13 |
---|---|
c - 2024-11-04 (1) | 2024.11.04 |
55일차 - 2024-10-08 (0) | 2024.10.08 |
54일차 - 2024-10-04 (2) | 2024.10.04 |
53일차 - 2024-10-02 (0) | 2024.10.03 |