Apakah nilai pointer `this` konstan selama masa hidup objek?

19

Apakah nilai thispointer dijamin konstan selama masa pakai objek tertentu? Saya tidak bisa membayangkan kasus di mana itu akan berubah, tetapi tidak tahu apakah saya tidak kehilangan sesuatu.

Daniel Langr
sumber
4
Nilai thispointer selalu adalah nilai dari alamat objek tempat fungsi dipanggil. Jadi pertanyaannya setara dengan 'dapatkah suatu benda mengubah alamat ingatannya sepanjang hidup?'
Aconcagua
2
Perlu dicatat: jika seseorang berbicara tentang umur secara tidak resmi, objek yang dipindahkan std::moveakan mengubah thispointer. Secara formal kita dapat mengatakan bahwa itu adalah dua objek yang berbeda, tetapi secara informal orang mungkin menganggapnya "sama," yang dapat menimbulkan kebingungan jika seseorang tidak memperhatikan.
Cort Ammon

Jawaban:

27

Apakah nilai thispointer dijamin konstan selama masa pakai objek tertentu?

Ya .

Seperti yang dikatakan oleh pengguna Aconcagua : nilai thispointer selalu adalah nilai dari alamat objek tempat fungsi dipanggil pada 1 . Jadi pertanyaannya setara dengan:

Bisakah suatu objek mengubah alamat memorinya sepanjang hidup?

Ini tidak mungkin, dengan definisi lifetime2 . Masa hidup suatu objek dimulai ketika atau setelah penyimpanannya diperoleh dan berakhir sebelum saat dilepaskan.


1) [class.this]/1

Dalam isi fungsi anggota non-statis ( [class.mfct]), kata kunci thisadalah nilai awal yang nilainya adalah penunjuk ke objek yang dipanggil untuk fungsi tersebut.

2) [basic.life]/1 (beri penekanan pada saya)

Masa pakai suatu objek atau referensi adalah properti runtime dari objek atau referensi. Variabel dikatakan memiliki inisialisasi kosong jika itu adalah inisialisasi default dan, jika itu adalah tipe kelas atau array (mungkin multi-dimensi) daripadanya, tipe kelas tersebut memiliki konstruktor standar sepele. Masa hidup suatu objek bertipe Tdimulai ketika :

  • penyimpanan dengan perataan dan ukuran yang tepat untuk jenis Tdiperoleh , dan
  • inisialisasi (jika ada) selesai (termasuk inisialisasi kosong) ( [dcl.init]), kecuali bahwa jika objeknya adalah anggota serikat pekerja atau sub-proyeknya, masa pakainya hanya dimulai jika anggota serikat tersebut adalah anggota yang diinisialisasi dalam serikat pekerja ( [dcl.init.aggr], [class.base.init]), atau sebagai dijelaskan dalam [class.union].

Umur objek obertipe Tberakhir ketika :

  • jika Tadalah tipe non-kelas, objek dihancurkan, atau
  • jika Tadalah tipe kelas, panggilan destruktor dimulai, atau
  • penyimpanan yang diduduki oleh objek dilepaskan , atau digunakan kembali oleh objek yang tidak bersarang di dalam o( [intro.object]).
YSC
sumber
Apakah ini berarti bahwa tidak mungkin (ilegal) untuk runtime yang cukup kompleks untuk mengimplementasikan pemadatan memori otomatis untuk program C ++? Atau apakah itu hanya berarti bahwa ia perlu berperilaku "seolah-olah", untuk memberikan nilai yang sama thissetiap kali, terlepas dari gerakan di tumpukan?
Alexander - Pasang kembali Monica
2
@Alex dengan jelas aturan as-if berlaku. Selalu.
YSC
1
@ Alexander-ReinstateMonica the vtable adalah konsep serupa yang mengurangi kinerja, tetapi diterima karena manfaatnya lebih besar daripada sisi negatifnya. Prosesor modern sangat efisien dengan tipuan.
Mark Ransom
1
@MarkRansom " adalah pointer dijamin menjadi alamat objek, atau apakah kompiler bebas untuk menambahkan tingkat tipuan? " Menurut definisi bahwa ptr adalah alamat objek, tetapi "alamat" bisa menjadi konsep abstrak tingkat tinggi . Tetapi kemudian jika Anda memperkenalkan tipuan, Anda perlu atomicity, Anda perlu mengunci, Anda memerlukan banyak pekerjaan tambahan pada semua akses dari objek apa pun, jika ada utas. Hanya dengan melihat dan merasakannya, saya bisa itu tidak bisa dijalankan (dan saya bahkan belum menganggap fakta C / C ++ berfungsi ganda sebagai bahasa tingkat rendah).
curiousguy
1
@curiousguy Anda membuat poin bagus, dan saya tidak lagi berdebat bahwa tipuan akan praktis. Itu masih membuat eksperimen pemikiran yang baik.
Mark Ransom
8

Objek memiliki wilayah penyimpanan. thispoin di sana.

[intro.object]/1

Objek menempati wilayah penyimpanan dalam periode konstruksinya ( [class.cdtor]), sepanjang masa pakainya, dan dalam periode penghancurannya ( [class.cdtor]).

Caleth
sumber
-1

Nilai thisdijamin konstan jika program pernah membacanya, jika kemudian beberapa bit dari nilai baca tidak mungkin untuk mengumpulkan sampah atau jika kemudian beberapa bit dari nilai baca lolos di luar program. Dalam semua kasus lain, ia berperilaku seperti kucing Schrödinger, yaitu konstan dan variabel pada saat yang sama.

simbol atom
sumber
Maaf, tidak mengerti sama sekali. Apa gunanya mengumpulkan sampah dan melarikan diri di luar program ?
Daniel Langr
@DanielLangr Bit dari nilai pengidentifikasithis
atomsymbol
Ini tidak menjawab pertanyaan saya. Apa gunanya mengumpulkan beberapa bit? Atau untuk menghindarinya di luar program?
Daniel Langr
@DanielLangr Sulit untuk menjelaskan dalam sepotong kecil teks
atomsymbol