| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- winapi
- const
- directx
- 줄 세우기
- C++
- Programmers
- TObjectPtr
- RVO
- 티스토리챌린지
- UnrealEngine5
- 2294
- 백준
- NRVO
- GeeksForGeeks
- UE5
- UnrealEngine4
- algorithm
- Effective C++
- 언리얼엔진5
- 팰린드롬 만들기
- 오블완
- DirectX11
- IFileDialog
- baekjoon
- 1563
- softeer
- C
- Unreal Engine5
- 프로그래머스
- RootMotion
- Today
- Total
목록C++ (45)
Game Develop
class Parent { public: Parent() { cout
아래와 같은 코드가 있다고 가정해보고 분석해보자. char* ptc = "Hello"; 여기서 Hello는 메모리구조중 하나인 Text Segment에 저장되고 그 주소를 리턴해서 ptc에 저장된다. 반드시 Text Segment에 저장되는게 아니라 Data Segment에 담겨지기도 한다는데, 이는 컴파일러마다 다르다고 한다. 일단 본 글에선 Text Segment라고 가정한다. TextSegment에 대한 설명은 아래와 같다. 프로그램 파일의 내용이 저장된다. 즉, .exe 내용인 기계어. 그리고 3, 'a', "Hello" 같은 리터럴이 저장된다. 개발자가 절대 수정할 수 없는 Read-Only 영역이다. 개발자가 수정할 수 없는 읽기전용의 영역이기 때문에 ptc라는 변수를 이용해서 값을 변경하는건..
static변수는 선언과 함께 메모리에 할당되어 프로그램 종료까지 메모리를 점유한다. 초기화되지 않은 정적변수,전역변수는 BSS영역에 할당될 것이고 초기화된것은 Data영역에 할당될것이다. 위의 경우, 초기화 되지 않았으니 BSS영역일것이다. fun()함수를 여러번 호출하더라도 t1은 최초선언할 때 생성자를 호출해서 생성된 이후, 계속 메모리를 점유하고있기 때문에 생성자를 여러번 호출하지 않는다. 결국 1번만 호출하기 때문에 답은 C이다. 이 문제는 변환생성자(conversion constructor)를 아느냐 마느냐를 물어보는 문제다. 나는 이 문제에서 처음 알게된 생성자다;; 진짜 여기 사이트 문제풀어보길 잘한 것 같다. 물론 이펙티브 c++책을 사기도 했고, 결국 알게됐었겠지만 아마 좀 더 나중이지..
내 포트폴리오에 SafeDelete를 구현하면서 관련 글이 나와서 읽었는데, 알아두면 좋을것 같아 따로 적는다. 일반 단일객체야 그냥 Delete 쓰면 되고, 문제는 배열을 동적할당 받은것을 해제할 때다. int *t = new int[2]; delete t; // 에러 delete[] t; // Ok. t라는 변수는 그저 주소를 담고있는 포인터변수니까 delete t; 해도 괜찮지 않을까..하는 작은 의구심을 가지고 있을 수 있겠지만, 우리의 목표는 new int[2]로 할당된 힙메모리의 영역을 전부 해제시키는거다. 근데 그냥 delete t;만 하면 int 1개 정도의 메모리만 해제된다. 그리고 심지어 에러가 뜬다.. 메모리누수 관련된 에러인데 12바이트의 메모리누수에 대한 에러가 뜬다. 우리가 할당..
초기화리스트를 사용해야 하는 경우 2가지와 사용할 경우 이점을 설명해보겠다. 1. 클래스에서 상수형변수, 참조형변수를 멤버변수로 보유해야 할 경우. 상수형 변수와 참조형 변수는 둘 다 반드시 선언과 동시에 초기화를 시켜야 한다. 애초에 그렇게 하지 않으면 바로 에러가 나오기 때문에 컴파일도 못한다. 초기화리스트는 말 그대로 '초기화'이기 때문에, 생성자에서 원하는 값으로 초기화가 가능하다. 메인함수에서 인스턴스를 생성할 때 원하는 매개변수값으로 해당 인스턴스의 상수형변수, 참조형변수를 초기화시키는게 가능하다는 것이다. 아래의 예시를 보면 잘 되는걸 확인할 수 있다. 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 ..
이런 유형의 문제가 나올줄은 몰랐는데.. 정답은 C이다. 코드에 이 있어서 가독성이 좀 별로긴한데, 어쨌든 Test클래스 코드 끝에보면 a;라고 되어있는게 있다. 즉, 클래스를 정의함과 동시에 해당 클래스 인스턴스를 전역변수로 선언해놓은것이다. 그렇기 때문에 전역변수인 Test a의 생성자가 먼저 실행되고, 그다음 메인함수에 진입하여 cout
위 문제의 정답은 D이다. 왜일까? 아마 C라 생각한 사람도 있을 수 있다. 하지만 C++에서 Class는 기본적으로 따로 명시하지 않을 경우, 접근제한자는 private이다. (struct는 public) 그렇기 때문에 위의 Point클래스에서의 생성자는 private이고 main함수에서 저렇게 호출 할 수 없다. 그래서 당연히 컴파일단계에서 에러가난다. 위 문제의 정답은 C이다. t1은 저 선언만으로 스택에 Point만큼의 크기를 할당받았지만, t2는 그냥 객체의 주소를 담는 포인터변수일 뿐이다. 아마 C++문법이나 생성자호출에 대해 따로 공부하지않은 사람은 슬슬 헷갈릴 수도 있다. 위 문제의 정답은 C이다. 앞서 말했듯이, 포인터변수는 선언하더라도 생성자가 호출되지 않는다. new연산자를 통해 힙메..
복사생성자가 호출되는 경우를 고르는 문제이다. 이전문제와 같이 A,B,C,D가 전부 해당하기 때문에 정답은 E인 All of the above이다. 차례대로 보자면, A. 클래스의 객체가 값으로 리턴될 때 B. 클래스의 객체가 함수에 매개변수로 넘겨질 때 C. 같은 클래스의 다른 객체를 기반으로 객체를 생성할 때 D. 컴파일러가 임시 객체를 생성할 때 E. 전부 다 A같은 경우, 함수 내에서 Temp a; return a; 라는 구문을 실행할 경우 a라는 인스턴스는 함수가 끝날 때 같이 소멸하지만, a를 리턴받는 곳에서 a의 값을 이용해 복사생성한 객체를 받기 때문에 복사생성자가 호출된다. 참고로 A의 경우처럼 객체를 값으로 리턴할 때 RVO,NRVO라는 컴파일러 최적화 기법?이 있다. 일단 간단하게 말..