Alıntı (erdem:1305370083):
> Alıntı:
> Sınıf nesneleri normalde çöp toplamalı bellekte yer alırlar. Bazı durumlarda ise program yığıtında oluşturulurlar:
* new ile oluşturulduklarında
Ben bu ifade ile ne anlatılmak istendiğini anlamadım :huh:
Digital Mars'taki açıklamalar açık değil. :p Orada listelenen maddelerin ve ile bağlanmaları gerektiğini düşünüyorum:
Alıntı (D spec):
> Class instances are normally allocated on the garbage collected heap. However, if they:
* are allocated as local symbols in a function
* are allocated using new
* use new with no arguments (constructor arguments are allowed)
* have the scope storage class
Yani; yerel olmalı, new ile ayrılmış olmalı, new'ün parametre almayanı çağrılmış olmalı, ve scope depolama türünden olmalı... diyecektim ki bunula ilgili bir hata aradım ve buldum:
http://d.puremagic.com/issues/show_bug.cgi?id=1521
Neredeyse 4 senelik hatada aynen benim söylediğim sorgulanmış: O sayfadaki maddeler ve ile mi bağlanıyorlar, veya ile mi?
Bence bu konuyu şu anlayışla geride bırakalım: Sınıf nesnesi öbekte oluşturulur; sınıf değişkeni ise tanımlandığı duruma göre değişir. Bunun benzerini çok yazdık ve gördük ama bir programcık daha:
import std.stdio;
struct Yapı
{
int i;
}
class Sınıf
{
int i;
}
scope class scope_Sınıfı
{
int i;
}
void main()
{
auto y0 = Yapı();
auto y1 = new Yapı;
auto s0 = new Sınıf;
scope s1 = new Sınıf;
// auto s2 = new scope_Sınıfı; // derleme hatası
scope s3 = new scope_Sınıfı;
bilgiVer("normal yapı", &y0.i);
bilgiVer("new ile yapı", &y1.i);
bilgiVer("normal sınıf", &s0.i);
bilgiVer("normal sınıf scope ile", &s1.i);
bilgiVer("scope sınıfı scope ile", &s3.i);
}
void bilgiVer(T)(dstring açıklama, T adres)
{
writefln("%30s: %s", açıklama, adres);
}
Çıktısından anlaşıldığı gibi, yapı ve sınıf nesneleri yığıtta da öbekte de oluşturulabiliyorlar:
' normal yapı: FFEA7A68
new ile yapı: F7372E20
normal sınıf: F7372E18
normal sınıf scope ile: FFEA7A7C
scope sınıfı scope ile: FFEA7A8C
'
Alıntı:
> Alıntı:
> All class-based objects are dynamically allocated-unlike in C++, there is no way to allocate a class object on the stack.
Bununla ters düşmüyor mu :)
Ters düşüyor. O sayfadaki açıklama hatalı.
Alıntı:
> Bir de bir ek daha. Makalenin orijinalinde:
http://www.digitalmars.com/d/2.0/memory.html#stackclass
Allocating Class Instances On The Stack
Yani sınıfa ait örnekler için yığıt üzerinde bellek ayırmak diyor.
Allocating Class Objects On The Stack
Yani sınıf nesneleri için yığıt üzerinde bellek ayırmak demiyor. Ya da ben yanlış anlıyorum :)
Orada "instance" ile "object" aynı anlamda kullanılmış.
Alıntı:
> Alıntı (erdem):
>
> > class A
> > {
> > int x = 42;
> > }
> >
> > unittest
> > {
> > auto a1 = new A;
> > assert(a1.x == 42);
> > auto a2 = a1; // yeni bir A nesnesi oluşturulmaz sadece A nesnesi
> > // a2 tarafından da gösterilmeye başlanır
> > // ...
> > }
> > ```
> >
>
> Benim değiştirdiğim kısım şu şekildeydi:
>
> 'Sınıflar kişiliği olan elemanlar oldukları için kopyalanmamaları gerekir.'
Öyle çok kısıtlayıcı oluyor. Duruma göre nesneleri özellikle kopyalamak zorunda kalabiliriz. Hatta kopyalamazsak hatalı olabilir. Bunun benzerini dizilerde görebiliriz: Referans türleri oldukları halde .dup ile kopyalayabiliyoruz ve duruma göre kopyalamamız gerekiyor.
Alıntı:
> 'Yukarıdaki örnekte olduğu gibi. Kopyalanmamaları gerekiyor derken aynı nesneyi gösteren birden fazla referans olmasına izin vermemeliyiz.'
Ama o zaman nesnelerin kişilikli olmalarına ters düşmüş oluruz. Duruma göre tam tersi olarak birden fazla referansın aynı nesneyi göstermesini isteriz. Örneğin bir çatı, o çatıyı kullanan kodların oluşturduğu bir sınıf değişkenini (referansını) alabilir ve ileride etkileşmek için saklayabilir. Nesneyi oluşturan kodlar da aynı nedenle saklayabilirler.
Sonuçta aynı nesneye erişim sağlayan değişken (referans) hem çatının içindeki bir dizide duruyor olabilir, hem de onu oluşturan tarafta örneğin bir eşleme tablosunda... Çok doğal bir durum. (Şimdilerde kullandığımız bir C++ çatısında aynen böyle oluyor.)
Alıntı:
> 'Çünkü beklenmeyen bir şekilde referans değiştiği zaman uygulamanın bir yerinde olan sürpriz değişiklikler diğer tarafına da yansıyabilir.'
Kabul ama o zaman programda bir hata var demektir. Eğer bir tarafındaki değişikliklerin öteki tarafı etkilemesini istemiyorsak .dup ile kopyalamış olmalıyızdır.
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]