C/C++
- new / delete 와 malloc/free
- C의 malloc/free 보다 장점이 많아 new/delete 사용을 권장하는 것은 맞지만 반드시 그래야 하는 것은 아니다.
- 단순 메모리 할당만을 목적으로 한다면 malloc/free가 다양한 함수를 제공해주기 때문에 더 편리한 면도 있다.
-- realloc : malloc로 할당한 메모리 크기를 재할당 할 때 사용하는 함수. new에는 이러한 기능이 없어 크기 조정의 경우 새로 동적할당을 하고, 기존 내용을 복사하고 메모리를 해제하는 과정을 거쳐야 한다.
-- 항상 동적할당을 새롭게 하기 때문에 new의 경우 메모리 크기를 재할당 할 때마다 메모리 번지가 바뀌게 된다.
-- _msize : 실행 중에 할당된 블록의 크기를 조사하는 함수. 마찬가지로 malloc는 지원하지만, new는 지원하지 않는다.
- 할당 대상이 객체가 아니고, 재할당을 빈번하게 한다면 malloc/free를 사용할 수도 있다. 단, 객체를 할당할 때는 반드시 new/delete를 써야한다.
- new/delete는 생성자, 소멸자를 호출해주지만 malloc/free는 그렇지 않기 때문이다.
- 또한 malloc/free 와 new/delete는 반드시 짝을 맞춰서 써야하며 섞어서 사용이 불가능하다
ex) malloc/delete or new/free => 불가능
WinAPI
- 스크린 좌표와 윈도우 좌표
- 모두 좌상단이 원점이고 오른쪽으로 가면 +x, 아래쪽으로 가면 +y 방향이다.
- 좌표값은 픽셀 단위이다.
- 윈도우 좌표의 원점은 상단 메뉴 및 타이틀바는 제외한 위치이다.
- 윈도우 창의 크기는 타이틀바, 메뉴바는 물론 테두리 두께까지 모두 포함한 크기이다.
- 윈도우 창 크기를 500, 300으로 설정했다면 타이틀바, 메뉴바, 두께 모두 포함하여 500, 300 크기가 설정되므로 실제 클라이언트 화면은 500, 300이 되지 않는다.
- SAL 주석
- HINSTANCE
- 실행된 프로세스의 시작 주소
- 가상 메모리 시스템이 사용되기 이전의 옛날에는 같은 프로세스가 여러개 실행될 수 있기 때문에, 현재 실행된 프로세스의 시작 주소 뿐만 아니라 이전에 실행되었던 프로세스의 시작 주소까지 함께 저장해야 했다.
- 현재는 가상 메모리 시스템을 사용하기 때문에 실행된 프로세스의 시작 주소만 가지면 충분하다.
- 같은 프로세스를 여러개 동작시켜도 HINSTACE의 값은 같을 것이다. HINSTANCE는 가상 메모리의 주소를 담고있기 때문이다.
- 실제 메모리에 올라가는 물리적인 위치는 알 수 없다.
- 각각의 프로세스에겐 모두 자신만의 가상 메모리가 주어진다.
- 메세지
- 다양한 프로세스들 중에서 현재 포커싱이 되어있는 프로세스에게 발생한 이벤트에 대한 메세지들을 보내준다.
- 그러면 해당 프로세스의 메세지 큐에 메세지가 들어가고 순차적으로 꺼내져서 이벤트가 처리 된다.
- 즉, 아무리 현재 실행중인 프로세스들이어도 현재 포커싱 되어있지 않다면 메세지 큐에 메세지가 저장되지 않는다.
- GetMessage, TranslateMessage, DispatchMessage
- GetMessage
- 현재 프로그램의 메세지 큐에 저장된 메세지를 꺼내는 함수
- GetMessage 함수를 통해 MSG 구조체 안에, 발생한 메세지의 정보를 저장함.
- 프로세스별로 윈도우 창을 여러개 만들 수도 있다. 이 때, 해당 프로세스의 어떤 윈도우 창에서 이벤트가 발생했는지까지
정보가 저장되어 있는데 그 정보는 MSG 구조체 안에 hwnd 라는 항목에 저장된다.
- GetMessage 함수는 메세지 큐에 메세지가 없으면 다음 메세지를 확인할 때까지 대기한다.
- 메세지 타입이 WM_QUIT일 때, GetMessage 함수는 false를 반환하여 프로그램이 종료된다.
- 프로세스 종료 전에 윈도우부터 모두 종료(할당 해제) 됐을 것이고 마지막으로 프로세스를 종료하라는 의미로 WM_QUIT 메세지가 들어오는 것이다
- 즉, 이벤트가 발생해야만 동작하는 프로그램이라는 뜻. 이벤트가 전혀 없으면 프로그램도 아무런 동작을 하지 않고 대기하게 된다.
- TranslateMessage
- 받아온 메세지에 대한 분석 작업을 하는 함수
- DispatchMessage
- 메세지를 관련 처리기 쪽으로 보냄
=> 해당 윈도우의 처리기쪽 함수가 호출이 됨. 처리기에서 해당 메세지가 어떤 것인지에 따라 분기처리가 된다.
처리기 쪽으로 넘어가면 사용자 지정 함수가 호출되는 것 같음.
- DispatchMessage를 통해 메세지가 처리기로 넘어와서 어떤 메세지인지에 따라 분기 처리될 때 switch-case 문을 사용한다.
- 이때, 모든 상황에 대한 case문이 존재하는 것은 아니다. case문에 걸리지 않는 수많은 프로시저(메세지)들은 DefWindowProc라는 함수로 처리가 된다.
- DefWindowsProc
- 윈도우 제공 함수로 윈도우 메세지가 너무 많기 때문에 직접 처리를 원하는 케이스는 case문을 통해 처리하고 그 외에는 이 함수를 사용하여 윈도우에서 제공되는 기본 프로시저를 통해 처리를 해주겠다는 의미
'TIL' 카테고리의 다른 글
[TIL] 20221025 성장일지 (0) | 2022.10.25 |
---|---|
[TIL] 20221024 성장일지 (0) | 2022.10.24 |
[TIL] 20221011 성장일지 (0) | 2022.10.11 |
[TIL] 20221007 성장일지 (0) | 2022.10.07 |
[TIL] 20221006 성장일지 (2) | 2022.10.06 |
댓글