SORU
11 Temmuz 2009, CUMARTESİ


Diziler, yığın yığın ve değer türleri

int[] myIntegers;
myIntegers = new int[100];

Yukarıdaki kod yeni[100] yığında dizi oluşturuluyor int? C) CLR üzerinde okuduklarıma#, cevabım Evet. Ama, gerçek int ne olduğunu anlayamadığım dizi içinde. Onlar gibi değer türleri, ben ... sanırım onlar da olabilirim kutulu olarak verebilirim, örneğin, pass myİntegers için diğer parça programı ve ... kadar karmakarışık yığını halinde olduklarını solda sürekli. Yoksa ben mi yanılıyorum? Sadece kutulu olacaklarını tahmin ediyorum ve ne kadar dizi var için öbek yaşayacak.

CEVAP
11 Temmuz 2009, CUMARTESİ


Dizinizi öbek üzerinde tahsis edilir ve değer vermez kutulu değildir.

Şaşkınlığınızı kaynak kişi başvuru türleri yığın üzerinde ayrılmış olduğunu söyledi çünkü büyük bir değer türleri yığın üzerinde ayrılmış. Bu tamamen doğru bir temsili bile değil.

Yerel değişkenler ve parametreler tüm yığında ayrılır. Bu değer türleri ve referans türleri de vardır. İkisi arasındaki tek farksaklıdeğişken. Şaşırtıcı olmayan bir şekilde, bir değer türü içindeğertürü doğrudan değişken içinde saklanır ve bir başvuru türü için, bu tür değer yığın üzerinde depolanırbaşvurudeğişken içinde saklanan bu değer için.

Aynı alanlar için geçerlidir. Toplam bellek türünün bir örneği (bir sınıf veya yapı birimi) için ayrılan zaman, örnek alanların her biri için depolama içerir. Referans tipi alanları için, bu depolama yığında sonra ayrılmış olur kendisi hangi değeri için sadece bir başvuru içerir. Değer tipi alanları için, bu depolama gerçek değerini tutar.

Bu yüzden, aşağıdaki türde verilen:

class RefType{
    public int    I;
    public string S;
    public long   L;
}

struct ValType{
    public int    I;
    public string S;
    public long   L;
}

Bu tür değerleri, bellek (32-bit kelime boyutu varsayarak) 16 bayt gerektirir. Alanı I her durumda alır 4 bayt depolamak değeri, alan S alır 4 bayt deposu başvuru ve alanı L alır 8 bayt depolamak değeri. RefType ValType hem değer hafızası bu gibi görünüyor:

 0 ┌───────────────────┐
   │        I          │
 4 ├───────────────────┤
   │        S          │
 8 ├───────────────────┤
   │        L          │
   │                   │
16 └───────────────────┘

Şimdi Eğer bir işlev içinde üç yerel değişkenler olsaydı, türleri RefType, ValType int[] bu gibi:

RefType refType;
ValType valType;
int[]   intArray;

senin gibi olabilir yığın sonra:

 0 ┌───────────────────┐
   │     refType       │
 4 ├───────────────────┤
   │     valType       │
   │                   │
   │                   │
   │                   │
20 ├───────────────────┤
   │     intArray      │
24 └───────────────────┘

Yani bu yerel değişkenler için değerler atanmış, eğer:

refType = new RefType();
refType.I = 100;
refType.S = "refType.S";
refType.L = 0x0123456789ABCDEF;

valType = new ValType();
valType.I = 200;
valType.S = "valType.S";
valType.L = 0x0011223344556677;

intArray = new int[4];
intArray[0] = 300;
intArray[1] = 301;
intArray[2] = 302;
intArray[3] = 303;

Sonra yığını böyle bir şey olabilir:

 0 ┌───────────────────┐
   │    0x4A963B68     │ -- heap address of `refType`
 4 ├───────────────────┤
   │       200         │ -- value of `valType.I`
   │    0x4A984C10     │ -- heap address of `valType.S`
   │    0x44556677     │ -- low 32-bits of `valType.L`
   │    0x00112233     │ -- high 32-bits of `valType.L`
20 ├───────────────────┤
   │    0x4AA4C288     │ -- heap address of `intArray`
24 └───────────────────┘

Adres 0x4A963B68 (refType değer) bellek gibi bir şey olacaktır:

 0 ┌───────────────────┐
   │       100         │ -- value of `refType.I`
 4 ├───────────────────┤
   │    0x4A984D88     │ -- heap address of `refType.S`
 8 ├───────────────────┤
   │    0x89ABCDEF     │ -- low 32-bits of `refType.L`
   │    0x01234567     │ -- high 32-bits of `refType.L`
16 └───────────────────┘

Adres 0x4AA4C288 (intArray değer) bellek gibi bir şey olacaktır:

 0 ┌───────────────────┐
   │        4          │ -- length of array
 4 ├───────────────────┤
   │       300         │ -- `intArray[0]`
 8 ├───────────────────┤
   │       301         │ -- `intArray[1]`
12 ├───────────────────┤
   │       302         │ -- `intArray[2]`
16 ├───────────────────┤
   │       303         │ -- `intArray[3]`
20 └───────────────────┘

Şimdi ise başka bir fonksiyon için intArray geçtin, değer yığının üstüne itti 0x4AA4C288, dizinin adresideğildizinin bir kopyası.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CNNMoney

    CNNMoney

    16 Kasım 2006
  • undrmyumbrellaa

    undrmyumbrel

    25 Temmuz 2012
  • Utah Valley Online

    Utah Valley

    9 AĞUSTOS 2010