`this` 포인터의 값이 객체의 수명 동안 일정합니까?


19

this특정 객체의 수명 동안 포인터 값 이 일정하게 유지됩니까? 나는 그것이 변하는 경우를 상상할 수 없지만 내가 빠진 것이 있는지 모르겠습니다.


4
this포인터 의 값은 항상 함수가 호출 된 객체의 주소 값입니다. 따라서 질문은 '객체가 수명 시간 동안 메모리 주소를 변경할 수 있습니까?'와 같습니다.
아콩 카과

2
주목할 점 : 수명에 대해 비공식적으로 이야기하면 이동하는 객체가 포인터를 std::move변경 this합니다. 공식적으로 우리는 그것들이 두 가지 다른 대상이라고 말하지만, 비공식적으로 그것들은 "동일한"것으로 생각할 수 있는데,주의를 기울이지 않으면 혼란을 일으킬 수 있습니다.
Cort Ammon

답변:


27

this특정 객체의 수명 동안 포인터 값 이 일정하게 유지됩니까?

.

사용자 Aconcagua 가 말했듯이 : this포인터 의 값은 항상 1 에서 함수가 호출 된 객체의 주소 값입니다 . 따라서 질문은 다음과 같습니다.

수명이 지남에 따라 객체의 메모리 주소를 변경할 수 있습니까?

lifetime2의 정의에 따르면 불가능합니다 . 오브젝트의 수명은 스토리지 확보 시점 또는 이후에 시작하여 해제되기 전에 종료됩니다.


1) [class.this]/1

비 정적 ( [class.mfct]) 멤버 함수 의 본문 에서 키워드 this는 값이 함수 인 함수에 대한 포인터 인 prvalue 입니다.

2) [basic.life]/1 (강조 광산)

객체 또는 참조의 수명은 객체 또는 참조의 런타임 속성입니다. 변수가 기본값으로 초기화되고 변수가 클래스 유형이거나 (다차원) 배열 인 경우 해당 클래스 유형에는 간단한 기본 생성자가 있습니다. 다음과 같은 T경우 유형의 객체 수명이 시작됩니다 .

  • 저장 적절한 정렬 및 크기와 유형을 T수득 하고,
  • 초기화 (있는 경우) ((진공의 초기화 포함) 완료 [dcl.init])를 제외한 그 목적은 조합원 또는 하위 객체 그 경우, 그 조합의 구성원이 조합의 초기화 부재의 경우 수명은 시작 ( [dcl.init.aggr], [class.base.init]), 또는 에 설명되어 [class.union]있습니다.

o유형 객체 의 수명은 다음과 같은 T경우에 종료됩니다 .

  • 만약 T 비 클래스 타입, 객체 파괴, 또는
  • 만약 T 클래스 유형이다 소멸자 호출이 시작, 또는
  • 객체가 차지하는 스토리지가 해제 되거나 o( [intro.object]) 안에 중첩되지 않은 객체가 재사용합니다 .

이것은 C ++ 프로그램에 대해 자동화 된 메모리 압축을 구현하기에 충분히 복잡한 런타임이 불가능한 것 (불법)을 의미합니까? 아니면 this힙의 움직임에 관계없이 매번 동일한 값을 제공하기 위해 "있는 그대로"동작해야한다는 의미 입니까?
알렉산더-복원 모니카

2
@Alex는 as-if 규칙이 우선합니다. 항상.
YSC

1
@ Alexander-ReinstateMonica vtable은 성능을 저하시키는 유사한 개념이지만 이점이 단점보다 중요하기 때문에 허용됩니다. 최신 프로세서는 간접적으로 효율적입니다.
마크 랜섬

1
@MarkRansom는 " 객체의 주소를 보장 포인터, 또는 간접? 수준을 추가 할 무료 컴파일러이다 " 정의에 PTR 객체의 주소이라고하지만, "주소"는 높은 수준의 추상적 인 개념이 될 수 . 그러나 간접 성을 도입하면 원 자성이 필요하고 잠금이 필요하며 스레드가있는 경우 모든 객체의 모든 액세스에 대한 추가 작업이 필요합니다. 단순히 모양과 느낌에 의해 나는 그것을 실행할 수 없습니다 (그리고 C / C ++이 저수준 언어로 두 배가된다는 사실조차 고려하지 않았습니다).
curiousguy

1
@ curiousguy 당신은 좋은 지적을하고, 나는 더 이상 간접적 인 것이 실용적이라고 주장하지 않습니다. 그래도 여전히 좋은 생각 실험을합니다.
마크 랜섬


-1

의 값 this이 프로그램은 이제까지 그것을 읽는 경우 읽기 값의 이후 일부 비트를 수집하거나 경우 쓰레기로 불가능한 경우 읽기 값의 일부 비트 프로그램의 외부 탈출 이후 보장은 일정해야합니다. 다른 모든 경우에 슈뢰딩거의 고양이처럼 행동합니다. 즉, 동시에 일정하고 가변적입니다.


죄송합니다. 전혀 이해하지 못했습니다. 어떤은 의 수집에프로그램의 외부 탈출 ?
다니엘 랭거

@DanielLangr 식별자 값의 비트this
atomsymbol

이것은 내 질문에 대답하지 않습니다. 가비지로 어떤 비트를 수집합니까? 아니면 프로그램 밖에서 그들을 탈출?
Daniel Langr

@DanielLangr 작은 텍스트로 설명하기 어렵다
atomsymbol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.