2014-01-12 10 views
5

C++에서이 포인터는 실제로 현재 오브젝트를 가리키는 숨겨진 인수로 메소드에 전달되지만 'this'포인터는 스택, 힙, 데이터의 메모리에 저장됩니다. ?'this'포인터가 할당 된 메모리

+0

메소드가 호출 될 때 코드가 'this'가 어딘지를 어떻게 알 수 있다고 가정하면 ... 여러 요인에 따라 달라 지겠지만, 분명히 추측하거나 어셈블리 컴파일러를 볼 수 있습니다. 아이디어를 얻기 위해 생성됩니다. – asveikau

+0

나는 'this'가 실제로 포인터가 아니며 그 표현이 사실이라고 읽는다. – nilesh

+0

정확한 복제본 [여기서 'this'포인터는 컴퓨터 메모리에 저장되어 있습니까?] (http://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory) –

답변

6

이 표준은 지정하지 않습니다 당신은 그것이 하나 개의 변수와 다른 아무것도의 보유 볼 수 있습니다.

해당 함수를 호출 할 때 멤버 함수로 전달되면 일부 컴파일러는이를 레지스터로 전달하고 다른 멤버는 스택으로 전달합니다. 또한 컴파일러 옵션에 따라 달라질 수 있습니다.당신이 확신 할 수있는 유일한 일에 대해

this 기본 유형의 를 rvalue 때문이다, 그래서 당신은 자신의 주소를 취할 수 없습니다.

항상 그런 것은 아닙니다.

사전 표준 C++에서 this으로 지정할 수 있습니다. 생성자의 실패를 나타 내기 위해. 이것은 예외가 도입되기 전이었습니다. 건설 실패를 나타내는 현대의 표준 방법은 예외를 던져 버리는 것입니다. 이는 질서 정연한 정리 (악명 높은 MFC 배치 new 버그와 같이 사용자 코드에 의해 훼손되지 않는 경우)를 보장합니다.

1

C++에서 this은 "단순히"현재 개체에 대한 포인터입니다. 그것은 당신이 개체 - 특정 데이터에 액세스 할 수 있습니다.

클래스의 코드는 다음 코드가 예를 들어

:

this->temperature = 40.0f; 

이 객체가 작용되고 무엇 이건 온도를 설정은 (temperature 가정하면 모든 객체들이 공유하는 정적 클래스 수준 아니다 클래스의).

this 포인터 자체는 (동적 메모리 측면에서) 할당 할 필요가 없으며, 모든 것이 커버 아래에서 어떻게 처리되는지에 달려 있습니다. 표준에서 실제로 요구하지 않는 것입니다. 행동에 대한 것보다).

수는 일 수 있습니다. 스택에서, 특정 메모리 위치, 레지스터 등에 등이 있습니다. 당신이 염려해야만하는 것은 기본적으로 객체에 접근하는 방법을 사용하는 동작입니다.

무엇이 this을 가리키며 개체 자체이며 동적 할당 또는 스택에 보통 new으로 할당됩니다.

1

이 포인터는 클래스 함수 스택 (또는 때때로 레지스터)에 할당됩니다.

그러나 실제로 질문하는 것은 아닙니다.

+1

사실 그것은 묻고있는 질문과 정확히 일치하는 것처럼 보입니다. 나는 대답이 너무 상상을 초월한 것 같지 않다. –

0

이 포인터는 개체 자체에 있습니다. 일종의입니다. 이것은 객체의 메모리 위치입니다.

개체가 스택에 있으면이 포인터가 스택에 있습니다.

개체가 힙에있는 경우이 포인터는 힙에 있습니다.

결론은 걱정할 필요가 없습니다.

* [업데이트] 내 대답을 철회/명확히/정정하겠습니다. 물리적 인 this 포인터는 객체에 없습니다.

나는이 포인터가 컴파일러에 의해 파생되었다고 결론을 내리고 간단히 기호 테이블에 저장된 개체의 주소입니다. 의미 상으로 그것은 객체 내부에 있지만 OP가 요구했던 것이 아닙니다.

다음은 스택에있는 3 개의 변수의 메모리 레이아웃입니다. 가운데 하나가 대상입니다. this 포인터가 저장되는 위치

enter image description here

+0

그러면 우리가 객체의 크기를 계산하면 실제 크기 +이 포인터의 크기, 즉 4 바이트를 얻게 될 것입니다. 그러나 이것은 그렇지 않습니다. – nilesh

+0

sizeof 연산자에 나타나지 않습니다. 포인터는 컴파일러에 따라 크기가 다를 수 있습니다. 가상 함수가있는 경우에는 sizeof 연산자에 표시되지 않는 숨겨진 함수 포인터 테이블도 있습니다. –

+0

하지만 vtable을 가리키는 가상 포인터에 할당 된 추가 4 바이트를 볼 수 있습니다 – nilesh