Thread overview
Dilimlerde Paylaşımın Sonlanması
Aug 15, 2022
Salih Dincer
Aug 15, 2022
Salih Dincer
Aug 15, 2022
Ali Çehreli
Aug 15, 2022
Ali Çehreli
Aug 16, 2022
Salih Dincer
Aug 16, 2022
Ali Çehreli
August 15, 2022

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...

August 15, 2022

On Monday, 15 August 2022 at 18:05:18 UTC, Salih Dincer wrote:

>

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?

Tek Paragraf Anlatım

Kısaltmalar:

  • başı dilimi: B
  • sonu dilimi: S

d'nin elemanları, B ile S tarafından paylaşılır ve B'ye eleman eklendiğinde veya uzunluğu arttırıldığında 15 birim ötesine kopyalanıyor. Eğer S de bu birimin adresine genişlerse onun da paylaşımı sonlanarak B'nin ilerisine kopyalanıyor.

Özetle bu incelemede, başta 1 literal dizi + 3 dilim varken; sonda paylaşım olmayan 3 dinamik dizi (...00, ...10, ...20) kalıyor. Sanırım bunlara dilim diyemeyiz çünkü her biri birbirinden bağımsız.

Sevgiler, saygılar...

August 15, 2022
On 8/15/22 11:48, Salih Dincer wrote:

> Özetle bu incelemede, başta 1 literal dizi + 3 dilim varken; sonda
> paylaşım olmayan 3 dinamik dizi (...00, ...10, ...20) kalıyor. Sanırım
> bunlara dilim diyemeyiz çünkü her biri birbirinden bağımsız.

Bu "dilim ve dinamik dizi" ("slice" ve "dynamic array") terimleri İnglizce'de de karışıklık yaratıyor. Yolumuza çoğunlukla aksamadan devam ediyoruz ama ben burada da kendi kafamdaki görüntüyü söyleyeyim: Bağımsız olsalar da hepsi yine de dilim. Görünürde dinamik dizi yok çünkü o D runtime'a ait bir şey.

Hepsi yine de dilim çünkü bütün işleri var olan elemanlara erişim sağlamak.

Ali

August 15, 2022
On 8/15/22 11:05, Salih Dincer wrote:

> Paylaşımı sonlanmayan `sonu dilimi`

O konuda eleman eklendiğinde "no stomping" nedeniyle dizinin yepyeni bir yere taşındığını söylemiştim. Genelde doğru ama işin içine bir de "optimization" giriyor. (Sen de bunu anlatıyorsun zaten. :) )

D runtime akıllı davranıyor ve diziyi büyütürken eğer komşu bölge boşsa hiç kopyalamadan orayı kullanıyor. Bu ancak dilimlerden birisine eklenirken mümkün.

Ali

August 16, 2022

On Monday, 15 August 2022 at 19:57:42 UTC, Ali Çehreli wrote:

>

D runtime akıllı davranıyor ve diziyi büyütürken eğer komşu bölge boşsa hiç kopyalamadan orayı kullanıyor. Bu ancak dilimlerden birisine eklenirken mümkün.

Ali hocam, peki runtime bu davranışı, akıllı tavrı tüm türler için geçerli mi?

Yani, @nogc kullanmadığım sürece, kendi türlerimde de aynı davranışı mı sergileyecek?

Teşekkürler...

August 16, 2022
On 8/15/22 21:29, Salih Dincer wrote:
> On Monday, 15 August 2022 at 19:57:42 UTC, Ali Çehreli wrote:
>> D runtime akıllı davranıyor ve diziyi büyütürken eğer komşu bölge
>> boşsa hiç kopyalamadan orayı kullanıyor. Bu ancak dilimlerden birisine
>> eklenirken mümkün.
>
> Ali hocam, peki runtime bu davranışı, akıllı tavrı tüm türler için
> geçerli mi?

Evet, bizim türlerimizin dizileri için de geçerli. Zaten çalışma zamanında, yani runtime düzeyinde tür bilgisi yoktur. Eleman eklemek gerektiğinde bizim türümüzün örneğin 16 baytlık olduğunu bilecek ve "devamında 160 baytlık kullanılmayan yer varmış; orayı da bu dizinin kapasitesine ekleyeyim" diyecek.

Ali