일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- UnrealEngine5
- 팰린드롬 만들기
- Programmers
- directx
- 언리얼엔진5
- 백준
- Unreal Engine5
- UE5
- C++
- DeferredRendering
- RVO
- 오블완
- Frustum
- winapi
- C
- baekjoon
- IFileDialog
- 2294
- UnrealEngine4
- NRVO
- 프로그래머스
- algorithm
- 1563
- softeer
- 티스토리챌린지
- RootMotion
- const
- DirectX11
- GeeksForGeeks
- 줄 세우기
- Today
- Total
목록C++ (26)
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) 가 있으면 ‘일단’ 할당받을 메모리..
특정 클래스에서 크기가 큰 멤버변수를 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"; // ..
const char* cc = "maxlevel"; 위의 코드에서 "maxlevel"은 DataSegment의 rodata 영역에 저장된다. 아마 read only의 줄임말로 ro라 한것같다. 다만, 저런 리터럴값들이 DataSegment에 저장할 수도 있고, TEXT Segment (CodeSegment)에 저장될 수도 있다고 한다. 컴파일러마다 차이가 있다고 하니, 명심하자. 구글링하면 어떤 글은 Data Segment에 저장된다고 하고 어떤 글은 Text Segment에 저장된다고 나와있기 때문에 헷갈릴 수 있다. 일단 Data Segment라고 가정하겠다. 어쨌든 문자열리터럴은 readOnly영역에 있기 때문에, cc[0] = 's' 이런식으로 값수정은 불가능하다. 그래서 char*에 문자열을 담..
알다시피 문자열의 끝은 반드시 \0이 있어야한다. 그렇기 때문에 어떠한 문자열을 저장하는 char 배열을 선언할 경우, 반드시 문자의 개수보다 1개 더 크게 잡아야한다. maxlevel 은 8글자이지만, 배열의 크기는 최소 9로 잡아줘야한다. char cArray[9] = "maxlevel"; 문자개수와 똑같은 크기인 8로 선언할 경우, 컴파일에러가 발생한다. 컴파일시점에서 반드시 문자열의 끝에는 \n이 있어야한다고 보장해줘야한다는 의미이다. 만약, maxlevel이라는 문자열의 앞 3글자 max를 low로 바꿔서 최종적으로 lowlevel이라는 문자열을 만드는게 목적이라면, 아래와 같이해야한다. char a1[9] = "maxlevel"; char a2[] = "low"; memcpy(a1, a2, s..
1. STL의 end()멤버함수는 마지막원소 다음의 주소를 가리키고있다. 해당 주소를 역참조하면 쓰레기값이 들어있으며, 애초에 역참조하려 하면 에러를 띄운다. 마지막 원소를 얻고싶으면 아래와 같이한다. vector v = {0,1,2,3,4,5}; // 예시 컨테이너는 이걸로 계속 사용. int lastElement = *(--v.end()); // end()는 마지막의 다음 주소이기때문에 --연산. 2. erase(iter)를 할 경우, iter를 포함해서 그 이후의 iterator들의 값들은 다 유효하지 않다. (매우중요) 때문에 역참조를 할 경우 에러가 발생하며, iter이전의 값들에 대해서만 역참조가 가능하다. (굳이 하려한다면) erase()의 리턴값은 iterator이며, iter을 삭제한 후..