On 05/29/2013 03:59 PM, Peter Williams wrote:

> I've been trying to find out how non ref array arguments are passed to
> functions in D but can't find any documentation on it.

The following concepts are relevant:

- Dynamic array: Maintained by the D runtime

- Fixed-length array (aka static array): Can be on the stack

- Slice: An efficient tool to access a range of elements (of any type of array)

Usually, it is the slice that gets passed:

  void foo(int[] slice);

A slice is made up of the pointer to the first element and the number of elements:

struct __SomeImplementationDependentName__
{
    size_t length;
    void * ptr;
}

When you pass a slice by-value, as in the case of foo() above, that struct gets copied: a copy of the argument...

So, slice variables have value semantics but they are used as references to elements.

Fixed-length arrays are a different story: Unlike C arrays and unlike D slices, the elements are always copied.

> If doing that is not much less efficient than passing by ref (and isolates > the external representation of the array from anything I do) then I can stop
> using ref and the problem goes away.

Yes, simply pass-by-reference. Not expensive at all. There may be surprises though; you may want to read this article:

  http://dlang.org/d-array-article.html

Ali

Reply via email to