オブジェクトの存続期間中、 `this`ポインターの値は定数ですか?


19

thisポインターの値は、特定のオブジェクトの存続期間中、一定であることが保証されていますか?それが変わるようなケースは想像できませんが、何かを逃していないかどうかはわかりません。


4
thisポインタの値は常に、関数が呼び出されたオブジェクトのアドレスの値です。したがって、質問は「オブジェクトがそのメモリアドレスを存続期間中に変更できるか」
アコンカグア

2
注目に値する:寿命について非公式に話すと、オブジェクトを介して移動するオブジェクトはポインタstd::moveを変更しthisます。正式には、これらは2つの異なるオブジェクトであると言いますが、非公式に「同じ」と考えるかもしれません。
Cort Ammon

回答:


27

thisポインターの値は、特定のオブジェクトの存続期間中、一定であることが保証されていますか?

はい

ユーザーAconcaguaが言うように:thisポインターの値は常に、関数が1で呼び出されたオブジェクトのアドレスの値です。したがって、質問は次と同等です:

オブジェクトは、メモリアドレスを存続期間中に変更できますか?

lifetime2の定義により、これは不可能です。オブジェクトの存続期間は、そのストレージが取得されたときまたは取得された後に始まり、解放される前に終了します。


1) [class.this]/1

非静的([class.mfct])メンバー関数の本体では、キーワードthisprvalueであり、その値は、関数が呼び出されるオブジェクトへのポインターです。

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は、パフォーマンスを低下させる同様の概念ですが、メリットがマイナス面を上回っているため、受け入れられます。最新のプロセッサーは、間接参照を使用して本当に効率的です。
Mark Ransom

1
@MarkRansom " は、オブジェクトのアドレスであることが保証されているポインタですか、またはコンパイラは間接参照のレベルを自由に追加できますか? " 定義により、ptrはオブジェクトのアドレスですが、 "アドレス"は高レベルの抽象的な概念である可能性があります。しかし、インダイレクションを導入する場合、アトミック性が必要であり、ロックが必要であり、スレッドがある場合は、オブジェクトのすべてのアクセスに対して追加の作業が必要になります。単にそのルックアンドフィールによって、それが機能しない可能性があります(C / C ++が低レベル言語としても機能するという事実さえ考慮していません)。
curiousguy

1
@curiousguyあなたは良い点を述べています、そして私はもはや間接が実用的であると主張していません。それでもなお、良い思考実験が行われます。
Mark Ransom


-1

の値はthis、プログラムがこれを読み取る場合、その後読み取り値の一部のビットがガベージコレクションできない場合、または読み取り値の一部のビットがプログラムの外にエスケープされる場合は、一定であることが保証されます。それ以外の場合はすべて、シュレーディンガーの猫のように動作します。つまり、一定であり、同時に可変です。


すみません、まったくわかりません。ガベージコレクションプログラムの外への脱出とは何ですか。
Daniel Langr

@DanielLangr識別子の値のビットthis
アトムシンボル

これは私の質問の答えにはなりません。ガベージコレクションのビットとは何ですか?または、プログラムの外でそれらをエスケープするには?
Daniel Langr

@DanielLangr小さなテキストで説明するのは難しい
アトムシンボル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.