Arrays, garbage collection

Foo via Digitalmars-d digitalmars-d at puremagic.com
Fri Jan 30 01:29:25 PST 2015


On Friday, 30 January 2015 at 01:08:31 UTC, bearophile wrote:
> The D type inference for array literals is now more flexible:
>
> void main() {
>     auto[$][$] m1 = [[1, 2], [3, 4], [5, 6]];
>     pragma(msg, typeof(m1));  // int[2][3]
>     const auto[string] aa1 = ["red": 1, "blue": 2];
>     pragma(msg, typeof(aa1)); // const(int)[string]
> }
>
>
> It helps avoid bugs like:
>
> int[5] a = [1,2,4,5];
> void main() {}
>
> And it makes the usage of value arrays (fixed size arrays) more 
> handy. We need to minimize the work that the garbage collector 
> has to do. Value arrays help in this. So making value arrays 
> more handy and natural to use is good (regardless how the 
> current Phobos hates them).
>
> - - - - - - - - -
>
> What's missing is a handy and compiler-efficient syntax to 
> create value array literals. Some persons have proposed the 
> "[]s" syntax:
>
>
> void main() {
>     // Some imports here.
>     foo([[1, 2]s, [3, 4]]s);
>     auto t1 = tuple([1, 2]s, "red");
>     auto aa1 = ["key": [1, 2]s];
>     auto pairs = 10.iota.map!(i => [i, i + 10]s);
> }
>
>
> To do those same things without the []s syntax you have to 
> write longer code.

----
@nogc
@safe
T[n] s(T = Args[0], size_t n = Args.length, Args...)(auto ref 
Args args) pure nothrow {
	return [args];
}

@nogc
@safe
T[n] s(T, size_t n)(auto ref T[n] values) pure nothrow {
	return values;
}
	
void main() {
	pragma(msg, typeof(s(1, 2, 3)));
	pragma(msg, typeof([1, 2, 3].s));
}
----

Compilation output:
int[3]
int[3]

You only have to type a dot between the array and the 's'.
Because of pure and nothrow and the low cost of the function call 
even such a lousy thing like the DMD optimizer should be capable 
of inlining such a function every time.


More information about the Digitalmars-d mailing list