기본 콘텐츠로 건너뛰기

C++/MFC

클래스는 오프셋을 기반으로 멤버함수를 호출한다.
클래스를 동적으로 생성하는 경우 크기만큼 스택을 움직이는 것이 아니라, 동적 메모리함수를 불러 결과값을 받아와 저장해서 사용한다.

클래스의 멤버함수는 컴파일시에 주소가 결정되기 때문에 함수를 부르는 형태를 보면 객체의 주소값을 받아와 바로 콜하는 형태를 갖는다.

가상함수가 있는 경우 객체의 가장 앞에 Vtable 포인터가 생성된다.

C++에서 멤버함수를 호출할 때는, 객체의 포인터인 this 변수가 따라간다. 매번 this가 넘어가기 때문에 묵시적이고, 스택이아니라 레지스터를 통해 넘어간다. IDA에서 __this 가 그 의미이다. gcc 컴파일러의 경우 this가 스택으로 넘어간다.

생성자와 소멸자는 선택 가능한 함수이다. 클래스 생성시 가장 먼저 호출된다.

동적으로 생성될때 동적 메모리 할당의 결과값이 유효하면 생성자 호출, 틀리면 0을 삽입한다. 이 때문에 IDA에서 코드블럭을 보면 좌우로 갈라졌다가 다시 합쳐지는 형태를 갖는다. 소멸자도 마찬가지이다.

Vtable은 .rdata 에 저장된다.

댓글

이 블로그의 인기 게시물

좌표압축

알 고리즘을 풀다 보면 좌표압축이라는 테크닉이 필요합니다. 저는 좌표압축을  "순위가 중요한 알고리즘에서, 입력값의 갯수보다 입력값의 범위가 클 때 사용하는 방법",  이라고 생각하고 있습니다. 1차원의 좌표로 예를 들어보겠습니다. n개의 x값 을 입력 받아, 입력 중 두개의  x1,x2를 선택하여 사이에 존재하는 점의 개수를 구하는 작업이 있다고 가정합시다. x의 범위는 int형의 범위인 -2^31 ~ 2^31-1 이고 중복은 없습니다. n은 5000 이하입니다. 입력은 n : 7, -2^31, -10000, 0 , -2000, 3, 6, 30000 , x1 = -10000, x2 = 30000 대략적으로 보면 그림과 같이 나타나게 됩니다. x1,x2 사이의 값을 구하게 되면 4개의 값이 나오게 됩니다. 이 경우 위의 값들을 아래와 같이 순위를 유지하면서 바꿔주어도 문제를 풀 수가있습니다. 이렇게   바꿔서 풀 수 있는 이유는 값보다 값의 순위가 중요하기 때문 입 니다. 압축좌표가  필요한 예 로, 카카오 코드 페스티벌 5번 캠핑 문제가 될 수 있습니다. 이 경우 좌표  x,y의 범위는 0 ~ 2^31-1  이지만, 입력받는  좌표의 개수는 최대 5000개  입니다. 만약 입력의 좌표를 그대로 반영하여 문제를 푼다고 하면 배열의 크기가 2^31-1 개가 되어야 합니다. 게다가 2차원으로.. 못풉니다. 탐색하다가 시간다 끝날꺼에요. 하지만 입력이 최대의 개수가 최대 5000이라고 했으니 좌표압축을 이용해 입력받은 좌표를 0~5000 으로 매치시키고 풀게되는 것 입니다.