2014-06-08 18 views
5

Prima domanda:Modo corretto per passare i parametri dell'array alle funzioni D

I parametri di funzione di array D sono sempre passati per riferimento o per valore? Inoltre, la lingua implementa Copy on Write per gli array? Ad esempio:

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

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

2 ° Domanda:

Supponiamo che io sono un grande allineamento che verrà passato a funzionare foo come parametro di sola lettura e dovrebbe essere evitato il più possibile la copia della matrice, dal momento che si presume che sia un oggetto molto grande. Quale tra i seguenti (o nessuno di loro) sarebbe la migliore dichiarazione per la funzione foo:

void foo(const int[] bigArray) 

void foo(in int[] bigArray) 

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

nella tua lista è un no-op (non so dove abbia senso), inoltre, utilizzare l'uso const immutabile dove è opportuno perché è più forte di const'ness – Quonux

risposta

10
  1. Tecnicamente, un array dinamico come int[] è solo un puntatore e una lunghezza. Solo il puntatore e la lunghezza vengono copiati nello stack, non i contenuti dell'array. Un arr[0] = 42; modifica l'array originale.
    Sul lato opposto, un array statico come int[30] è un semplice vecchio tipo di dati costituito da 30 consecutivi int s in memoria. Quindi, una funzione come void foo(int[30] arr) dovrebbe copiare 120 byte nello stack per l'inizio. In tal caso, arr[0] = 42; modifica la copia locale dell'array.

  2. In base a quanto sopra, ciascuna delle modalità elencate evita di copiare i contenuti dell'array. Quindi, se hai bisogno che il parametro sia const, in, const ref o altrimenti dipende da cosa stai cercando di ottenere oltre ad evitare la copia dell'array. Ad esempio, se si passa un parametro ref int [] arr, non solo è possibile modificarne il contenuto, ma è anche possibile modificare il puntatore e la lunghezza (ad esempio, creare un array completamente nuovo e assegnarlo a arr in modo che sia visibile da al di fuori della funzione).

Per ulteriori informazioni, si prega di fare riferimento ai corrispondenti articoli sul sito DLang copre arrays e array slices.

Problemi correlati