"This" işaretçisinin değeri nesnenin ömrü boyunca sabit mi?


19

thisİşaretçinin değerinin, belirli bir nesnenin ömrü boyunca sabit olması garanti ediliyor mu? Bunun değişeceği bir durumu hayal edemiyorum, ama bir şeyleri kaçırıp kaçırmadığımı bilmiyorum.


4
thisİşaretçinin değeri her zaman işlevin çağrıldığı nesnenin adresinin değeridir. Yani soru 'bir nesne yaşam boyunca bellek adresini değiştirebilir mi?'
Aconcagua

2
Dikkate değer: Kişi gayri resmi olarak hayattan bahsederse, taşınan bir nesne işaretçileri std::movedeğiştirir this. Resmi olarak bunların iki farklı nesne olduğunu söyleyebiliriz, ancak gayri resmi olarak biri onları "aynı" olarak düşünebilir, bu da dikkat etmiyorsa kafa karışıklığı yaratabilir.
Cort Ammon

Yanıtlar:


27

thisİşaretçinin değerinin, belirli bir nesnenin ömrü boyunca sabit olması garanti ediliyor mu?

Evet .

Kullanıcı Aconcagua'nın belirttiği gibi: thisişaretçinin değeri her zaman işlevin çağrıldığı nesnenin adresinin değeridir 1 . Yani soru şuna denktir:

Bir nesne yaşam boyu bellek adresini değiştirebilir mi?

Bu, lifetime2'nin tanımı ile mümkün değildir . Bir nesnenin ömrü, depolandığı zaman veya sonra başlar ve serbest bırakılmadan önce sona erer.


1) [class.this]/1

Statik olmayan ( [class.mfct]) üye işlevinin gövdesinde , anahtar kelime değeri işlevin çağrıldığı nesneye bir işaretçi olan thisbir ön değerdir.

2) [basic.life]/1 (benimkini vurgulayın)

Bir nesnenin veya başvurunun ömrü, nesnenin veya başvurunun çalışma zamanı özelliğidir. Bir değişkenin, varsayılan olarak başlatılmışsa ve sınıf tipinde veya (muhtemelen çok boyutlu) bir dizisindeyse, bu sınıf tipinde önemsiz bir varsayılan yapıcı varsa, boş bir başlatmaya sahip olduğu söylenir. Türdeki bir nesnenin ömrü şu Tdurumlarda başlar :

  • tipeT uygun hizalama ve boyutta depolama elde edilir ve
  • başlatma (varsa) tamamlanır (boş başlatma dahil) ( [dcl.init]), ancak nesne bir sendika üyesi veya alt nesnesiyse, ömrü yalnızca bu sendika üyesi sendikada ( [dcl.init.aggr], [class.base.init]) başlatılmış üye ise veya tarif [class.union].

Bir otür nesnenin ömrü şu Tdurumlarda sona erer :

  • Eğer Tolmayan bir sınıf tipi, nesne, ya da yok edilir
  • eğer Tbir sınıf tipidir yıkıcı çağrı başlatır veya
  • nesnenin kapladığı depolama serbest bırakılır veya o( [intro.object]) içine yerleştirilmemiş bir nesne tarafından yeniden kullanılır .

Bu, bir C ++ programı için otomatik bellek sıkıştırması uygulamak için yeterince karmaşık bir çalışma zamanının imkansız (yasadışı) olacağı anlamına mı geliyor? Yoksa sadece öbekteki thishareketlerden bağımsız olarak her seferinde aynı değeri sağlamak için "sanki" davranması gerektiği anlamına mı geliyor?
Alexander - Monica

2
@Alex açıkça as-if kuralı geçerlidir. Her zaman.
YSC

1
@ Alexander-ReinstateMonica the vtable, performansı düşüren benzer bir kavramdır, ancak faydaları olumsuz yönde ağır bastığı için kabul edilir. Modern işlemciler dolaylı olarak gerçekten verimlidir.
Mark Ransom

1
@MarkRansom " bir nesnenin adresi olmasını garanti bir gösterici veya dolaylama? Düzey eklemek için serbest derleyici " tanımı ile ptr bir nesnenin bir adres olduğu, ancak "Adres" yüksek seviyede bir soyut bir kavrama olabilir . Ama sonra dolaylılığı tanıtırsanız, atomikliğe ihtiyacınız var, kilitlemeniz gerekiyor, iplik varsa, herhangi bir nesnenin tüm erişimleri üzerinde bir sürü ek çalışmaya ihtiyacınız var. Sadece görünüşü ve hissi ile işe yaramaz olabilirim (ve C / C ++ 'nın düşük seviyeli bir dil olarak ikiye katlandığını bile düşünmedim).
curiousguy

1
@curiousguy iyi puanlar veriyorsunuz ve artık dolaylı aktarmanın pratik olacağını savunmuyorum. Yine de iyi bir düşünce deneyi yapıyor.
Mark Ransom


-1

Değeri thisprogramı Hiç okur eğer okunan değerin sonradan bazı bitleri ödemeli veya eğer çöp imkansız ise okunan değerin bazı bitleri programının dışında kaçan sonradan garanti, sabit olduğu. Diğer tüm durumlarda, bir Schrödinger'in kedisi gibi davranır, yani aynı zamanda sabit ve değişkendir.


Üzgünüm, hiç anlamadım. Ne SÇ için ve programın dışında kaçmak için ?
Daniel Langr

@DanielLangr Tanımlayıcının değerinin bitlerithis
atomsymbol

Bu sorumu cevaplamıyor. Çöp bazı bitleri toplamak için ne var? Veya programın dışına çıkmak için?
Daniel Langr

@DanielLangr Küçük bir metin parçasıyla açıklamak zor
atomsymbol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.