2014-06-08 27 views
5

1. Soru:Dizi parametrelerini D işlevlerine iletmenin uygun yolu

D dizisi işlevi parametreleri her zaman referans olarak mı, yoksa değer mi? Ayrıca, dil dizileri için Copy on Write uygular mı? Ör:

void foo(int[] arr) 
{ 
    // is arr a local copy or a ref to an external array? 

    arr[0] = 42; // How about now? 
} 

2 Soru:

varsayalım ben salt okunur parametre olarak foo işlev geçilecek büyük bir dizi var ve o zamandan beri, dizi kopyalama mümkün olduğunca kaçınılmalıdır Çok büyük bir nesne olduğu varsayılmaktadır. dan Aşağıdakilerden hangisi (veya bunların hiçbiri) işlevi foo en iyi beyanı olacaktır:

void foo(const int[] bigArray) 

void foo(in int[] bigArray) 

void foo(const ref int[] bigArray) 
+0

Listenizde no-op (herhangi bir anlam ifade etmediği), dahası, const kullanımından daha güçlü olduğu için const use immutable kullanıldığında – Quonux

cevap

10
  1. Teknik olarak int[] gibi sadece bir işaretçi ve bir uzunluk bir dinamik dizi. Dizi içeriği değil, yalnızca işaretçi ve uzunluk yığına kopyalanır. Bir arr[0] = 42;, özgün diziyi değiştirir.
    Diğer tarafta, int[30] gibi statik dizi statik bellekte ardışık int s oluşan eski bir veri türüdür. Yani, void foo(int[30] arr) gibi bir işlev, bir başlangıç ​​için yığına 120 bayt kopyalayacaktır. Böyle bir durumda, arr[0] = 42; dizinin yerel kopyasını değiştirir.

  2. Yukarıdakilere göre, listelediğiniz yolların her biri dizi içeriğini kopyalamayı önler. Yani, parametrenin const, in, const ref olması için gerekip gerekmediği ya da başka bir deyişle, dizi kopyalarından kaçınmanın yanı sıra, neyi başarmaya çalıştığınıza da bağlıdır. Örneğin, bir ref int [] arr parametresini geçirirseniz, yalnızca içeriğini değiştiremezsiniz, aynı zamanda işaretçiyi ve uzunluğu değiştirebileceksiniz (örneğin, tamamen yeni bir dizi oluşturabilir ve arr'a atayabilirsiniz; fonksiyonun dışında).

fazla bilgi için arrays ve array slices kapsayan DLang sitesinde ilgili makalelere bakınız.

İlgili konular