Merhaba,
Şurda başlayan tartışmada, bir d
dizisi başı
ve sonu
adında 2 eşit dilime bölünüyor. Aşağıdaki kodda da her ikisi de genişletiliyor; bir farkla:
Paylaşımı sonlanmayan sonu dilimi
, dizinin kapasitesi (d.capacity
) izin verdiği ölçüye kadar genişletilirse, paylaşımı sonlanan başı dilimi
'ne (biz buna kopyalanan başka bir dinamik dizi de diyebiliriz) ne kadar yaklaşır?
Geçemeyeceğine (aynı adresler üzerine yazılamayacağına) göre, tam olarak ne zaman benzer nedenlerden dolayı kopyalama tekrarlanır?
İşte bu güzel gözlem kodu, bize yukardaki sorular ve niceleri (diğer dilim/diziler de yer değiştirir mi? vb.)'ne cevap olabilir:
import std.stdio;;
alias T = byte;
void main()
{
T[] d = [ 1, 2, 3, 4 ];
T[] başı = d[0..$/2];
T[] sonu = d[$/2..$];
d.writeln(": [0] = ", &d[0]); //#1
başı.writeln(": [0] = ", &başı[0]);
sonu.writeln(": [0] = ", &sonu[0]);
writeln;
başı.length++;
d.writeln(": [0] = ", &d[0]); //#2
başı.writeln(": [0] = ", &başı[0]);
sonu.writeln(": [0] = ", &sonu[0]);
writeln;
sonu.length+=10;
d.writeln(": [0] = ", &d[0]); //#3
başı.writeln(": [0] = ", &başı[0]);
sonu[0..3].writeln("...: [0] = ", &sonu[0]);
for(int i; i <= sonu.length + 1; ++i){
const p = &d[0] + i;
p.writeln(": ", *p);
}
}
/* ÇIKTISI->
[1, 2, 3, 4]: [0] = 7F4BA54E7000
[1, 2]: [0] = 7F4BA54E7000
[3, 4]: [0] = 7F4BA54E7002
[1, 2, 3, 4]: [0] = 7F4BA54E7000
[1, 2, 0]: [0] = 7F4BA54E7010
[3, 4]: [0] = 7F4BA54E7002
[1, 2, 3, 4]: [0] = 7F4BA54E7000
[1, 2, 0]: [0] = 7F4BA54E7010
[3, 4, 0]...: [0] = 7F4BA54E7002
7F4BA54E7000: 1
7F4BA54E7001: 2
7F4BA54E7002: 3
7F4BA54E7003: 4
7F4BA54E7004: 0
7F4BA54E7005: 0
7F4BA54E7006: 0
7F4BA54E7007: 0
7F4BA54E7008: 0
7F4BA54E7009: 0
7F4BA54E700A: 0
7F4BA54E700B: 0
7F4BA54E700C: 0
7F4BA54E700D: 0
*/
Lütfen ekrana yansıtılan adresleri, 7F...F de dahil olacak şekilde sonu dilimi
'ni genişletin ve/veya başka satırlar ekleyip deneyin. Faydası olacaktır!
Dip Not: Adres hesabı 4'er byte olmasın diye tür olarak byte seçildi. Ama isterseniz başka türleri de deneyebilirsiniz.
Başarılar...