Initializing static arrays without specifying size
BCS
none at anon.com
Mon Aug 2 09:46:28 PDT 2010
Hello bearophile,
> Philippe Sigaud:
>
>> Would a template-based solution be OK?
>>
>> import std.stdio, std.traits;
>>
>> CommonType!T[T.length] staticArray(T...)(T vals)
>> if ((T.length > 0) && is(CommonType!T))
>> {
>> return [vals];
>> }
> That's one solution, but code like that is most useful when your
> arrays liters are long (because if they are little you can just count
> the items and avoid using staticArray), this is an example (I have
> used printf to avoid the metric ton of functions and templates used by
> writeln):
>
> import std.c.stdio: printf;
> import std.traits: CommonType;
> CommonType!T[T.length] staticArray(T...)(T vals)
> if (T.length && is(CommonType!T)) {
> return [vals];
> }
> void main() {
> auto a = staticArray(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
...
> 990);
> printf("%d\n", a[2]);
> }
> This is the asm of the staticArray:
>
> _D5test2217__T11staticArrayTiÉÛÿ ÀÀÈÈZÖFiiÉÛÿ ¤¤ZG100i
> comdat
> L0: push EAX
> push ESI
> push EDI
> push dword ptr 010h[ESP]
...
> push dword ptr 0328h[ESP]
> push 064h
> push ECX
> call near ptr __d_arrayliteralT
> mov ESI,EAX
> mov EDI,01A0h[ESP]
> mov ECX,064h
> rep
> movsd
> add ESP,0198h
> mov EAX,8[ESP]
> pop EDI
> pop ESI
> pop ECX
> ret 0190h
Is that with or without inline? If that doesn't inline away to a memcopy
then it looks like an optimization opportunity to me.
> And you essentially have one similar function each time you use
> staticArray. This is why in my answer I have said I don't know any
> good solution to this problem and this is why I have proposed the
> enhancement [$] syntax.
>
> In my code I count the items in some way (with Python, or I assign the
> literal to a dynamic array, print its length and then modify the code
> replacing the dynamic array with the printed number).
>
> Bye,
> bearophile
--
... <IXOYE><
More information about the Digitalmars-d-learn
mailing list