일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C++
- 유럽
- 초코 바나나 코코아
- this call
- 아이스 아메리카노
- 오사카
- 하이네켄 맥주 박물관
- 베론빵
- 도톤보리
- 다하우 수용소
- 나르비크
- 매스커피
- 하파란다
- 암스테르담 국립 미술관
- 여행
- 올륌픽 파르크
- 룰레아
- 리버 크루즈
- 플로우메터
- 포르쉐 박물관
- 국립 독일 박물관
- 파리
- 뮌헨
- 간사이 공항
- 아메리카노
- 독일
- Windows
- Qt
- 스타벅스
- 루브르 박물관
Archives
- Today
- Total
구름
[C++11/14][1-1]this call 본문
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가 추가되지 않는다.
따라서 객체 없이 함수호출이 된다.
같은 이유로 객체의 멤버변수에 접근할 수 없다.
Comments