On Wednesday, 1 June 2016 at 14:52:29 UTC, John Nixon wrote:
On Wednesday, 2 March 2016 at 21:37:56 UTC, Steven Schveighoffer wrote:

Pointer copying is inherent in D. Everything is done at the "head", deep copies are never implicit. This is a C-like language, so one must expect this kind of behavior and plan for it.

I sympathise with Ozan. What is the best reference you know that explains this fully?

Slices/dynamic arrays are literally just a pointer (arr.ptr) and a length (arr.length).

Assigning a slice simply copies the ptr and length fields, causing the slice to refer to the entire section of data. Slicing (arr[1..2]) returns a new slice with the ptr and length fields updated.

(This also means you can slice arbitrary pointers; ex. `(cast(ubyte*) malloc(1024))[0..1024]` to get a slice of memory backed by C malloc. Very useful.)

The only magic happens when increasing the size of the array, via appending or setting length, which usually allocates a new array from the GC heap, except when D determines that it can get away with not doing so (i.e. when the data points somewhere in a GC heap and there's no data in-use after the end of the array. capacity also looks at GC metadata).

Reply via email to