(apologies for cross-posting here, I feel this is a better place to ask than in my original post where I only received 1 answer that seemed in favor of this: http://d.puremagic.com/issues/show_bug.cgi?id=8008 which was 2 months ago).

Please see to the original post above to see the proposal for the new syntax for static array litterals
(but please reply here).

Running some simple tests show that this is not just cosmetics and ease of use but would also lead to significantly reduced overhead when dealing with static array litterals vs raw C array litterals, as currently D static array litterals perform costly heap allocation as intermediate step (as shown in the resulting assembly).

Here's 2 identical programs in C and D, which, compiled with all optimization flags, result in 20x speedup for the C version (D takes 17 sec with dmd -O -release -inline -noboundscheck main).

-----
//main.d
import std.stdio,std.conv;
void main(){
        size_t n=100000000,z=0;i=0,j=0;
        for(i=0;i<n;i++){
                size_t[10] a=[i,i+1,i+2,i+3,i+4,i+5,i+6,i+7,i+8,i+9];
                for(j=0;j<9;j++){z+=a[j];}
        }
        writeln(z);
}
-----
//main.c
#include <stdio.h>
int main(){
        size_t n=100000000,z=0;i=0,j=0;
        for(i=0;i<n;i++){
                size_t a[10]={i,i+1,i+2,i+3,i+4,i+5,i+6,i+7,i+8,i+9};
                for(j=0;j<9;j++){z+=a[j];}
        }
        printf("%lu\n",z);
        return 0;
}
-----
Note, the same D program modified as follows runs about as fast as the C program: size_t[10] a=void; a[0]=i; a[1]=i+1; a[2]=i+2;a[3]=i+3;a[4]=i+4;a[5]=i+5;a[6]=i+6;a[7]=i+7;a[8]=i+8;a[9]=i+9;

Having the new syntax auto a=[i,i+1,i+2,i+3,i+4,i+5,i+6,i+7,i+8,i+9]S would prevent the intermediate heap allocation and should be at least as fast as the C version, possibly faster if SSE instructions are used.

Finally, someone suggested somewhere else (http://www.digitalmars.com/d/archives/digitalmars/D/bugs/Issue_8008_New_static_array_literal_syntax_request_auto_x_1_2_3_S_39709.html) that this could be done in library code:
auto a = [1, 2, 3].toStatic;
however I don't see how that could be achieved, as by the time the array reaches the toStatic function, it is a dynamic array whose length is not known at compile time. Also, his suggested syntax auto[$] a=[1,2,3] is not as good in my opinion as it prevents one from directly passing an (anonymous) static array to a function, eg my_fun([1,2,3]S) vs: auto[$] a=[1,2,3]; my_fun(a);

Thanks for your comments!

Reply via email to