IMO geçici nesneler, dinamik (yığın) bellekte depolanır, ancak emin değilim. Düşüncelerimi onaylayabilir veya reddedebilir misiniz?Geçici nesne nerede saklanıyor?
cevap
Bu, yüksek düzeyde uygulamaya bağımlıdır, ancak muhtemelen otomatik depolama biriminde otomatik depolama biriminde bulunurlar.
Optimizasyon nedeniyle, kapsamın sezgisel olabileceğini unutmayın.
aşağıdadır: Burada
class A
{
//...
};
//....
A foo()
{
A a;
return a;
}
, nesne
a
mutlaka sadece işlevin kapsamı içine ikamet değildir, ancak RVO oluşabilir. Ayrıca, bir değere geçici bir nesne geçirirken, hemen imha edilmeyebilir. Burada
void foo(A a);
//...
foo(A());
, geçici mutlaka bu doğrultusunda sadece canlı değildir, ancak yöntemin bağımsız değişken yığın içinde doğrudan yapılabilir.
Standart, onlar için herhangi bir bellek alanını (yığın/yığın) zorunlu kılmaz, ancak bunlar ifadenin sonunda yer alan "otomatik depolama" gibi yerel değişkenler gibidir (veya bir ref-to öğesine bağlı olduğunda daha uzun) -const) onlar tahrip edildi.
Çoğu uygulama, bunları yerel değişkenler gibi yığında saklar.
düzenleme:
James Kanze belirttiği gibi: durumunda geçici ömrü, mağaza konumu biraz kayıt yeri tarafından belirlenen en uygulamaları ile ilgili olan bir ref-için-Kat ile uzatılır bu referans. Yani, referans statik depolamada olduğunda, geçici de olacaktır (sadece gcc'de onaylanmıştır). (IMHO bu hala standart anlamında geçici olsa da, bu kelimenin sezgisel ingilizce anlamında bir geçici olup olmadığı tartışılabilir)
-1 ve nedenini açıklayacağım. Kapsam, bir const referansına bağlı olmadığında bile ifadenin sonu değildir, ancak optimizasyonlar nedeniyle daha da genişletilebilir. Cevabımı gör. –
@LuchianGrigore: Örneğinizde, foo(); 'geri döndükten sonra geçici olacak? Bunun olmasına izin verilen standarttan alıntı yapabilir misiniz? – PlasmaHH
@Luchian Grigore Burada http://stackoverflow.com/questions/9018778/will-temporary-object-be-deleted-if-there-is-no-const-reference-to-it, bunun sonu olması gerektiğini söylüyor. İfade, değil mi? –
Çoğu (tümü olmasa bile) uygulamalar onları yığında saklar. depolama), standart hiçbir yerde olduğunu düşünmüyorum rağmen. Derleyicinin geçici değişkenin ömrünü garanti etmesi gerektiği gibi bunu yapmak da kesinlikle daha kolay ve söz konusu ömür süresinin geçici bir değişkenin başka bir örneğini oluşturarak aynı işlevi tekrarlayan bir çağrıyı kapsayaması olasıdır.
Bu, ömürlerine bağlı olarak değişir. Yaşam sürelerini uzatmak için yerel bir statik referansa bağlanmadığınız bir işlevin içinde oluşturduğunuz geçici konumlar büyük olasılıkla yığında oluşturulur. Yerel statik referanslara bağladığınız geçici oturumlar büyük olasılıkla program ikili programınızın .data bölümünde saklanır. Aynı, normal olmayan referanslara bağladığınız geçici aralıklar için de geçerlidir. Bir referansla ilişkilendirilen diğer bir değişken olmayan bir değişkenin başlatılması sırasında oluşturulan geçici olmayanlar, bu değişken olmayan değişkenin değerini üreten işlevin yığını üzerinde olmalıdır.
Açılma sırasında atılan nesneyi temsil eden istisna nesneler de geçici konumlardır. Bunlar genellikle yığında bulunurlar.
Cevabım, iş parçacığı yerel değişkenlerinin varlığını yok sayar. bununla uğraşan biri konuşmalı ve netleştirmelidir. –
Gerçekten de, OP muhtemelen onları göz önünde bulundurmamışken, istisnalar da zamansalar. C++ 11'deki intializer listelerinin yanı sıra. İş parçacığı yerel değişkenleri için, en azından x86_64/linux üzerinde, her bir iş parçacığı için farklı olarak ayarlanmış olan gs segment kaydının yardımıyla erişilen özel bir bellek bölümünde saklanırlar. – PlasmaHH
Özel durum nesneler geçici mi? Ya da tamamen başka bir şey. ( §3.7'de, standart dört "depolama süreleri" listeler: statik, iş parçacığı, otomatik ve dinamik. Bunu merak ettim: , özel durum nesneleri gibi farklı bir süreye sahiptir.) –
"IMO"? Neden bu senin fikrin miydi? Bunu kabul etmene ne sebep oldu? –