구름

[C++11/14][1-1]this call 본문

👨‍💻 C++

[C++11/14][1-1]this call

라탄 2016. 7. 31. 23:53

C++ 에서 객체의 멤버함수 호출 과정을 알아보도록 하겠습니다.

위 코드를 보면, Point 클래스에 set 함수, foo static 함수가 정의되어 있습니다.

C++ 에서 멤버 함수 정의 시 기본적으로 this 가 추가됩니다.

따라서 void set(int a, int b) 는 void set(Point* const this, int a, int b) 와 같으며

멤버함수 내의 x = a; y = b; 역시 컴파일 타임에 this->x = a; this->y = b; 와 같이 바뀌게 됩니다.


하지만 static 함수는 this 가 추가되지 않는데요,

static void foo(int a) 는 this 가 추가되지 않고 그대로 void(int a) 가 됩니다. 따라서 멤버변수인 x 에 접근하지 못하며 

컴파일시 에러가 뜨게 됩니다.

this 를 인자로 넣지 않아도 되므로, 21번째 줄 과 같이 객체 없이도 static 함수는 호출이 가능합니다.

이를 어셈블리어로 바꾸어 보면


이번에는 일반 함수(23번째 줄) 을 어셈블리어로 바꾸어보도록 하겠습니다.

먼저 p1.set(10, 20); 이 set(&p1, 10, 20); 으로 변경됩니다.


1. 멤버함수의 호출 원리

   객체가 함수의 첫번째 인자(this) 로 추가된다. - this call

   정확히는 ecx 레지스터로 전달됨.


2. static 함수에는 this가 추가되지 않는다.

    따라서 객체 없이 함수호출이 된다.

   같은 이유로 객체의 멤버변수에 접근할 수 없다.


0 Comments
댓글쓰기 폼