On Monday, 17 August 2015 at 13:27:19 UTC, Brandon Ragland wrote:
If that is true, than passing it as _char[] file_ makes the most sense to me. A pointer copy doesn't hurt as bad as an array copy, of say, 100Kibibytes...

Right.

Knowing this helps to explain a lot btw:

char[] foo;

void func(char[] arg) {

}

func(foo);


In that scenario, foo's data is not copied, just a pointer to it is. Very fast operation.

arg[0] = 'a';

Since it is a pointer, writing to the arg will also write to foo.

BUT:

arg = "a new thing";

This will NOT be seen outside. It wrote a new pointer to the local variable arg's pointer, so now arg and foo point to different data.

Similarly:

arg ~= 'a';

will not be seen outside. The pointer might change which is not seen outside, and the length will change, which is also not seen.


So char[] arg in D is similar to char* arg_ptr, size_t length_ptr in C - changing them inside the function just modifies local variables, not the outer variable. Writing *through the pointer will be seen outside though since they talk to the same data.




Similarly, slicing in D is just a pointer assignment:

char[] a = b[3 .. 4];

That's like in C:

a.ptr = b.ptr + 3;
a.length = 4-3;


Just basic arithmetic and assignment, no data copy going on.






This is all talking about T[] slices. Static arrays, in the form of T[constant], are different:



ubyte[4] static_data;

void slice_test(ubyte[] slice) {}

void static_test(ubyte[4] copy) {}


slice_test(static_data[]); // passes a pointer to the data

static_test(static_data); // passes a copy.




So T[] is always talking about pointer+length, but T[n] is always talking about a block of memory which is copied around to other T[n].

Putting the [] at the end of it, like I did with slice_test, fetches a pointer instead of copying. It is how you convert a static memory chunk to a pointer.



There's a few more things but you should understand it now, apply the low level principles to it and it all should make sense.

More reading:
http://dlang.org/d-array-article.html
http://dlang.org/arrays.html

Reply via email to